假设我有任何种类的类或结构。没有虚拟函数或任何东西,只有一些自定义构造函数,以及一些需要在析构函数中进行清理的指针。
在此结构上使用memcpy或memmove是否会有不利影响?删除移动的结构会引起问题吗?该问题假定内存对齐也正确,并且我们正在复制到安全内存。
最佳答案
在一般情况下,是的,会有问题。 memcpy
和memmove
都是按位操作,没有进一步的语义。这可能不足以移动对象*,并且显然还不足以进行复制。
在复制的情况下,它将中断,因为多个对象将引用同一动态分配的内存,并且多个析构函数将尝试释放它。请注意,像shared_ptr
这样的解决方案在这里无济于事,因为共享所有权是memcpy
/memmove
不提供的其他语义的一部分。
对于移动,在某些情况下,您可能会视类型而定。但是,如果对象持有指向要移动的元素的指针/引用(包括自引用),则将无法正常工作,因为指针将按位复制(再次,不再有复制/移动的语义),并且将指向旧位置。
总体答案仍然是相同的:不要。
*切勿在C++ 11的确切意义上采取行动。我已经看到了一个标准库容器的实现,该容器使用特殊标签来启用对象,同时通过使用memcpy
来增加缓冲区,但是它需要在存储的类型中使用显式注释,以将对象标记为可以安全地通过memcpy
移动。放置在新缓冲区中,旧缓冲区被丢弃而没有调用任何析构函数(C++ 11移动要求使对象处于可破坏状态,这无法通过此hack来实现)
关于c++ - memcpy或memmove会在复制类时引起问题吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12135769/