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

Ben*_*nnX 4 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
}
Run Code Online (Sandbox Code Playgroud)

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

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

我读到了:他说的是什么用途 - 用于放置新品

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

Pot*_*ter 9

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

f-> ~Foo();
Run Code Online (Sandbox Code Playgroud)

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

delete[] buffer;
Run Code Online (Sandbox Code Playgroud)

  • @BennX Placement new将分配与初始化分开.基本上,由于您使用两个步骤创建了对象,因此销毁它需要相反的两个步骤.`delete f`可能在实践中起作用,因为指针值恰好匹配,但它是未定义的行为:不能保证工作.最好是整洁和正确而不是简洁. (2认同)