我读了here那个
只要你小心,对象就可以了(不是邪恶的) 自杀(删除这个)。
以下是我如何定义“小心”:
您必须绝对100%肯定地确定此对象已分配 通过new(不是new [],也不是通过放置new,也不是通过new 堆栈,也不是命名空间范围/全局,也不是另一个对象的成员; 但通过普通的普通新事物。)
如果我使用新的展示位置,我还有哪些替代方案?
答案 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_ptr
和std::unique_ptr
到来之后,编写管理自己生命周期的对象变得不必要(并且不合需要)。
良好的c ++表单要求一个对象有一个责任。您的对象的责任是它所执行的工作。智能指针的职责是管理它的生命周期。
还有一个场景需要delete this
- 在为需要侵入式引用计数的旧API编写对象时。