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

Do i need to delete a object that was constructed with new and 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 的删除对系统有一些重大影响,我必须删除它,但可以说它是一个简单的存储对象,我将其完全放在缓冲区内并且没有解构器这确实删除了一些其他的东西。

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

You should not deallocate every object that is using the memory buffer. Instead you should delete[] only the original buffer.

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

f-> ~Foo();

通常 placement new 与堆栈上的内存一起使用。在这种情况下,它是堆分配,因此您需要使用与 new.

匹配的 delete 形式释放缓冲区
delete[] buffer;