可能重复:
C++: Delete this?
在C ++中,可以删除函数定义中的self对象。这有什么副作用?
class MyClass {
public:
void ~myClass() {}
void myFunction() {
// logic here
delete this;
}
}
谢谢!
答案 0 :(得分:12)
您可以从内部删除一个对象,但之后您不必访问该类实例的任何成员变量或函数。
答案 1 :(得分:12)
成员函数说删除它是否合法(和道德)?
只要你小心,对象就可以自杀了 (删除这个)。
以下是我如何定义“小心”:
你必须绝对100%肯定这个对象 通过new分配(不是通过new [],也不是通过新的,也不是本地的 堆栈上的对象,也不是全局的,也不是另一个对象的成员;但 通过简单普通的新方式。
您必须绝对100%肯定您的会员功能 将是在此对象上调用的最后一个成员函数。
你必须绝对100%肯定你的其余部分 成员函数(删除此行后)不触及任何一块 此对象(包括调用任何其他成员函数或 触摸任何数据成员。)
当然,通常的警告适用于此指针所在的情况 当你没有虚拟析构函数时指向基类的指针。
答案 2 :(得分:1)
这很危险。考虑一下:
void foo() {
MyClass bar;
bar.myFunction(); // calls delete
} // bar goes out of scope, calls delete again
查看此C++FAQ 16.15条目,了解何时可以执行delete this
- 这是合法的,只需要谨慎使用。
答案 3 :(得分:1)
这样做的副作用是对象不再有效,也不是指向该对象的指针或引用。
我在很多地方看过这种模式。通常,它用于引用计数的情况,当对象的最后一个引用消失时,对象将自行删除。它通常也与某种工厂功能配对,例如,一个名为Create的静态类成员函数,不带参数,并返回指向该类的指针。这个函数的主体执行相应的new
,你的构造函数甚至可以是私有的(这样人们就不会以一种会弄乱你的清理代码的方式创建对象)。
答案 4 :(得分:0)
取决于你对ok的定义!
如果你小心的话,你可以做到这一点,但你不应该在没有充分理由的情况下做到这一点,因为没有人会期待它,并且因为不能保证对象已被分配了新的。 / p>