memcpy或memmove会导致复制类的问题吗?

Ser*_*rge 5 c++ class memcpy memmove

假设我有任何类或结构.没有虚函数或任何东西,只是一些自定义构造函数,以及一些需要在析构函数中进行清理的指针.

在此结构上使用memcpy或memmove会有什么不利影响吗?删除移动的结构会导致问题吗?问题假设内存对齐也正确,我们正在复制到安全内存.

Dav*_*eas 9

在一般情况下,是的,会有问题.双方memcpymemmove都没有进一步的语义位运算.这可能不足以移动对象*,显然不足以复制.

在复制的情况下,它将断开,因为多个对象将引用相同的动态分配的内存,并且多个析构函数将尝试释放它.需要注意的是像解决方案shared_ptr将不利于在这里,作为共享所有权是部分进一步的语义memcpy/ memmove不提供.

对于移动,在某些情况下,根据类型,您可能会使用它.但是如果对象持有对被移动元素的指针/引用(包括自引用),它将无法工作,因为指针将被按位复制(同样,没有复制/移动的进一步语义)并将引用旧位置.

一般答案仍然是相同的:不要.


*不要在确切的C++ 11意义上移动到这里.我已经看到了标准库容器的一个实现,它使用特殊的标签来启用移动对象,同时通过使用增长缓冲区memcpy,但它需要在存​​储的类型中显式注释,标记对象在放置对象后可以安全地移动memcpy没有调用任何析构函数的情况下丢弃旧缓冲区的新缓冲区(C++ 11 移动需要将对象保持在可破坏状态,这不能通过此hack实现)


The*_*eve 5

通常在基于类的对象上使用memcpy不是一个好主意.最可能的问题是复制指针然后删除它.您应该使用复制构造函数或赋值运算符.