如何删除分配了 new 位置的对象

问题描述 投票:0回答:2

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 

感谢您的帮助。

c++ memory-management new-operator dynamic-memory-allocation
2个回答
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
投票

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

p->~myclass();


使用 std::aligned_storage 保持缓冲区正确对齐,例如:

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

© www.soinside.com 2019 - 2024. All rights reserved.