c++ 中的 new 运算符有很多面孔,但我对 placement new 感兴趣。
假设你在特定的内存位置分配内存
int memoryPool[poolSize*sizeof(int)];
int* p = new (mem) int; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
在这种情况下如何正确释放内存? 如果我使用一些名为 myClass 的类而不是内置类型 int 会怎样?
myClass memoryPool[poolSize*sizeof(myClass )];
myClass * p = new (mem) myClass ; //allocates memory inside the memoryPool buffer
delete p; //segmentation fault
感谢您的帮助。
在第一种情况下,使用 placement new 没有意义,因为
int
没有构造函数。
在第二种情况下,它要么毫无意义(如果
myClass
是微不足道的)要么是错误的,因为数组中已经有对象了。
您使用 placement new 来初始化内存块中的对象,该内存块必须适当对齐,并且不能已经包含(非平凡的)对象。
char memory[enough_bytes]; // WARNING: may not be properly aligned.
myClass * c = new (memory) myClass;
一旦你完成了它,你需要通过调用它的析构函数来销毁对象:
c->~myClass();
这将对象的生命周期与其内存的生命周期分开。您可能还必须在某个时候释放内存,具体取决于您如何分配内存;在这种情况下,它是一个自动数组,所以当它超出范围时会自动释放。
在您的情况下,无需释放它,一旦您从函数返回,您的 int 数组将被释放。你应该只明确地调用你的析构函数:
p->~myclass();
使用 std::aligned_storage 保持缓冲区正确对齐,例如:
http://www.cplusplus.com/reference/type_traits/aligned_storage/