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回答了这个相当不错:
只要你小心,对象就可以自杀(删除它).
这是我如何定义"小心":
- 你必须绝对100%肯定这个对象是通过new分配的(不是通过new [],也不是通过放置new,也不是堆栈上的本地对象,也不是全局,也不是另一个对象的成员;但是通过普通的普通新).
- 您必须绝对100%肯定您的成员函数将是在此对象上调用的最后一个成员函数.
- 您必须绝对100%肯定您的成员函数的其余部分(删除此行之后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员).
- 在删除此行之后,您必须绝对100%肯定没有人甚至触及此指针本身.换句话说,你不能检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情.
当然,当您没有虚拟析构函数时,此指针是指向基类的指针时,通常需要注意.
基本上,您需要像对待delete任何其他指针一样小心.但是,与明确声明的指针相比,有更多的区域可能会出现成员函数自杀的问题.
delete this如果不确定陷阱并解决它们,使用是一个坏主意.
一旦调用delete this该对象,将调用析构函数并释放动态分配的内存.
如果没有使用对象分配new,那将是一个Undefined behaviour.
如果之后访问了对象的任何数据成员或虚函数delete this,则行为将Undefined Behavior再次出现.
可能,最好避免delete this上述情况.