"删除这个"是个坏主意吗?

Lin*_*age 16 c++ memory-management

可能重复:
安全delete this吗?

我一直在为一个设计用作链表中的节点的类做一些工作,我想我会给类自己的删除功能而不是管理类这样做.所以基本上它是这样的:

void Class::Delete() {
    //Some cleanup code before deleting the object
    delete this;
}
Run Code Online (Sandbox Code Playgroud)

现在我已经对它进行了测试,看起来效果很好,但是我过去遇到过一个问题,即对象一直在运行代码,被删除,然后显然是通过尝试使用不再使程序崩溃存在的对象.

由于"删除这个"就在函数的末尾,它显然退出了函数并且工作正常,但这种做法是不是一个坏主意?如果我不小心,这会不会在我的脸上爆炸?

Dom*_*rto 21

FAQlite回答了这个相当不错:

只要你小心,对象就可以自杀(删除它).

这是我如何定义"小心":

  1. 你必须绝对100%肯定这个对象是通过new分配的(不是通过new [],也不是通过放置new,也不是堆栈上的本地对象,也不是全局,也不是​​另一个对象的成员;但是通过普通的普通新).
  2. 您必须绝对100%肯定您的成员函数将是在此对象上调用的最后一个成员函数.
  3. 您必须绝对100%肯定您的成员函数的其余部分(删除此行之后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员).
  4. 在删除此行之后,您必须绝对100%肯定没有人甚至触及此指针本身.换句话说,你不能检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情.

当然,当您没有虚拟析构函数时,此指针是指向基类的指针时,通常需要注意.

基本上,您需要像对待delete任何其他指针一样小心.但是,与明确声明的指针相比,有更多的区域可能会出现成员函数自杀的问题.

  • @Jon根据标准,无效指针的右值转换的左值是未定义的行为.删除一个对象会使*all*指针无效.(这与`删除这个'没有任何关系.它系统地持有.) (4认同)
  • 我好奇..为什么#4?打印指针等根本不访问底层存储器. (2认同)
  • 仅仅因为它在FAQLite中并不意味着它是真的.提到的每一点同样适用于所有删除.`删除这个'并没有什么特别的(实际上,在许多应用程序中,它将代表大多数删除). (2认同)

Alo*_*ave 6

delete this如果不确定陷阱并解决它们,使用是一个坏主意.

一旦调用delete this该对象,将调用析构函数并释放动态分配的内存.

如果没有使用对象分配new,那将是一个Undefined behaviour.
如果之后访问了对象的任何数据成员或虚函数delete this,则行为将Undefined Behavior再次出现.

可能,最好避免delete this上述情况.