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

时间:2016-04-04 13:52:49

标签: c++ memory memory-management this delete-operator

我读了here那个

  

只要你小心,对象就可以了(不是邪恶的)   自杀(删除这个)。

     

以下是我如何定义“小心”:

     

您必须绝对100%肯定地确定此对象已分配   通过new(不是new [],也不是通过放置new,也不是通过new   堆栈,也不是命名空间范围/全局,也不是​​另一个对象的成员;   但通过普通的普通新事物。)

如果我使用新的展示位置,我还有哪些替代方案?

3 个答案:

答案 0 :(得分:3)

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

myobj->~myclass();

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

答案 1 :(得分:0)

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指针不足以在一般情况下进行适当的破坏。

答案 2 :(得分:0)

std::shared_ptrstd::unique_ptr到来之后,编写管理自己生命周期的对象变得不必要(并且不合需要)。

良好的c ++表单要求一个对象有一个责任。您的对象的责任是它所执行的工作。智能指针的职责是管理它的生命周期。

还有一个场景需要delete this - 在为需要侵入式引用计数的旧API编写对象时。