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

时间:2014-02-04 12:02:10

标签: 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 

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

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

 delete p; //segmentation fault 

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

c->~myClass();

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

答案 1 :(得分:1)

在您的情况下,无需释放它,一旦从函数返回,您的int数组将被释放。你应该只明确地调用你的析构函数:

  

对 - >〜MyClass的();


保持缓冲区正确对齐使用std :: aligned_storage,例如在这里查看:

http://www.cplusplus.com/reference/type_traits/aligned_storage/