C++类的示例不是二进制可移动的

Vik*_*ehr -4 c++

有谁知道任何不是二进制可移动的C++类?

换句话说,您是否知道任何导致内存泄漏或未定义行为的类?

{ // New scope
// Allocate some memory
unsigned char data1[sizeof(MyClass)];
unsigned char data2[sizeof(MyClass)];
// Create an instance of the class
::new (data1) MyClass();
// Create a pointer and run some class-specific code
MyClass* ptr = (MyClass*) data1;
ptr->MyFunction();
// Binary move everything to data2
::memcpy((void*)data2, (void*)data1, sizeof(MyClass));
::memset((void*)data1, sizeof(MyClass), 0); // for clarification
// Run some code at the new memory location, same object
ptr = (MyClass*) data2;
ptr->MyFunction();
// Run destructor at memory location2
(&*data2)->~MyClass(); 
} // ... out of scope. No implicit destructors called. No memory leaks.
Run Code Online (Sandbox Code Playgroud)

更新:

  1. 通过二进制可移动,我的意思是任何可以二进制移动到内存中的另一个位置的对象,并且仍然可以正常运行(移动构造函数可以用memcpy()实现).

  2. 当然,任何指向它们的指针都不能移动,这不是问题的一部分.

  3. (澄清)tr1 :: smart_ptr,std :: deque,std :: vector和std :: list以及类似的类可以是二进制可移动的,所以在重新分配节点时不要讨论它们的内部行为.

  4. (澄清)处理内存分配的类可以是二进制可移动的,因为二进制移动意味着您在移动后不处理这两个对象,并且析构函数不会被调用两次.

sha*_*oth 8

如果任何其他对象存储指向对象的指针,则对象不再是二进制可移动的(也称为按位可移动).双链表单元素就是一个很好的例子.如果要重新定位双向链表的元素,则需要调整相邻元素中的指针.因此,如果您尝试仅用于memmove()重新定位元素,则列表会中断.

  • @Viktor:堆栈与任何东西有什么关系?如果您提出要回答的问题,可能会得到更好的回答,而不是在人们无法理解您的想法时抱怨. (2认同)