我读过这里
只要你小心,一个物体自杀是可以的(而不是邪恶的)(删除这个)。下面是我如何定义“小心”的方法:您必须绝对100%地肯定这个对象是通过new分配的(不是通过new[]分配的,也不是通过放置新的对象,也不是通过在堆栈上放置新的本地对象,也不是通过命名空间范围/全局,也不是另一个对象的成员;而是由普通的新对象分配的)。
如果我使用新的安置,我有什么选择?
发布于 2016-04-04 14:13:39
separate用于分隔内存分配和对象生存期,因此通常会显式调用析构函数:
myobj->~myclass();并在以后释放内存,或者继续将内存用于其他目的。
发布于 2016-04-04 14:22:51
新放置意味着对象不在堆上分配,而是由用户为其存储提供内存。在这种情况下,删除将尝试释放一个非堆块,这通常是致命的.
没有要删除的内容,因此必须执行显式析构函数调用:
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指针是不够的。
发布于 2016-04-04 14:36:03
自从std::shared_ptr和std::unique_ptr出现以来,编写管理自己生命周期的对象已经变得不必要(而且不受欢迎)。
好的c++表单要求一个对象有一个责任。您的对象的责任是它所执行的工作。智能指针的职责是管理其生命周期。
还有一个需要delete this的场景--当为旧API编写对象时,需要进行侵入性引用计数。
https://stackoverflow.com/questions/36404622
复制相似问题