使用 placement new 时删除它的替代方法

Alternative for delete this when using placement new

我读 here

As long as you’re careful, it’s okay (not evil) for an object to commit suicide (delete this).

Here’s how I define “careful”:

You must be absolutely 100% positively sure that this object was allocated via new (not by new[], nor by placement new, nor a local object on the stack, nor a namespace-scope / global, nor a member of another object; but by plain ordinary new).

如果我使用 placement new,我有什么选择?

Placement new 用于分隔内存分配和对象生命周期,因此通常显式调用析构函数:

myobj->~myclass();

稍后释放内存,或继续将内存用于其他目的。

Placement new表示对象不在堆上分配,而是由用户提供存储它的内存。在这种情况下删除会尝试释放非堆块,这通常是致命的...

没有可删除的内容,因此您必须执行显式析构函数调用:

struct SomeClass {
    SomeClass() { std::cout << "Constuctor\n"; }
    ~SomeClass() { std::cout << "Destructor\n"; }
};

std::aligned_storage<sizeof(SomeClass), alignof(SomeClass)>::type storage;
new(&storage) SomeClass();
reinterpret_cast< SomeClass* >(&storage) -> ~SomeClass();

只有一个 this 指针在一般情况下不足以进行适当的销毁。

自从 std::shared_ptrstd::unique_ptr 出现以来,编写管理自己生命周期的对象已变得没有必要(也不受欢迎)。

良好的 C++ 形式要求一个对象承担一项责任。您的对象的责任是它执行的工作。智能指针的职责是管理它的生命周期。

还有一种情况需要您 delete this - 在为需要侵入式引用计数的旧 API 编写对象时。