我是否需要删除使用new和placement构造的对象

时间:2015-07-27 11:22:34

标签: c++ memory memory-management new-operator placement

class Foo{
//some member
    public:
    int bar;
}

int main(){
    char* buffer = new char[100];
    Foo* f = new(buffer)Foo();
//do i have to
    delete f;
//or is 
    delete[] buffer;
//enough
}

当然,如果Foo的删除对系统有一些重大影响,我必须删除它,但是假设它是一个简单的存储对象,我放置在缓冲区内并且没有解构器删除其他一些东西。

  • 我是否必须删除一个具有新内部位置的对象 一个缓冲区还是足以删除缓冲区?
  • 如果我必须在缓冲区内的每个对象上调用delete,为什么呢 我有这个吗?

我读到:what-uses-are-there-for-placement-new他也说

  

您不应该释放使用内存缓冲区的每个对象。相反,你应该只删除[]原始缓冲区。

1 个答案:

答案 0 :(得分:9)

销毁该对象的正确方法是使用显式析构函数调用:

f-> ~Foo();

通常,placement new与堆栈中的内存一起使用。在这种情况下,它是堆分配,因此您需要使用与delete匹配的new形式释放缓冲区。

delete[] buffer;