如何删除使用placement new分配的对象

Pan*_*rei 4 c++ memory-management new-operator dynamic-memory-allocation

c ++中的new运算符有很多面孔,但我对新的贴片感兴趣.

假设您在特定内存位置分配内存

 int memoryPool[poolSize*sizeof(int)];
 int* p = new (mem) int; //allocates memory inside the memoryPool buffer

 delete p; //segmentation fault 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如何正确释放内存?如果不使用内置类型int,我会使用一些名为myClass的类?

 myClass memoryPool[poolSize*sizeof(myClass )];
 myClass * p = new (mem) myClass ; //allocates memory inside the memoryPool buffer

 delete p; //segmentation fault 
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Mik*_*our 5

在第一种情况下,使用placement new是没有意义的,因为int没有构造函数.

在第二种情况下,它是无意义的(如果myClass是微不足道的)或错误的,因为数组中已有对象.

您可以使用placement new来初始化内存块中的对象,该对象必须经过适当的对齐,并且不得包含(非平凡的)对象.

char memory[enough_bytes];  // WARNING: may not be properly aligned.
myClass * c = new (memory) myClass;
Run Code Online (Sandbox Code Playgroud)

一旦完成它,你需要通过调用它的析构函数来销毁对象:

c->~myClass();
Run Code Online (Sandbox Code Playgroud)

这将对象的生命周期与其内存的生命周期分开.您可能还需要在某个时刻释放内存,具体取决于您的分配方式; 在这种情况下,它是一个自动数组,因此当它超出范围时会自动释放.