删除类中的自我对象

时间:2011-08-05 06:02:47

标签: c++

  

可能重复:
  C++: Delete this?

在C ++中,可以删除函数定义中的self对象。这有什么副作用?

class MyClass {

public:
    void ~myClass() {}
    void myFunction() { 
        // logic here
        delete this;
    }
}

谢谢!

5 个答案:

答案 0 :(得分:12)

您可以从内部删除一个对象,但之后您不必访问该类实例的任何成员变量或函数。

答案 1 :(得分:12)

来自parashift FAQ

  

成员函数说删除它是否合法(和道德)?

     

只要你小心,对象就可以自杀了   (删除这个)。

     

以下是我如何定义“小心”:

     
      
  • 你必须绝对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>