删除类中的自我对象

ven*_*rty 11 c++

可能重复:
C++:删除这个?

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

class MyClass {

public:
    void ~myClass() {}
    void myFunction() { 
        // logic here
        delete this;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Zoe*_*oey 12

您可以从内部删除对象,但之后,您不必在执行此操作后访问该类实例的任何成员变量或函数.

  • @Luchian,祈祷告诉,这些成员函数是否会(在执行自己的情况下)如果不解除引用`this`的话?有一个非静态成员函数似乎有点愚蠢,不会对成员变量做什么,不是吗? (6认同)
  • @Luchian:+1来反击.你错了,在这里.你正在做的是试图描述未定义的行为,这当然是愚蠢的.当然在大多数平台上都很好,但是不再与C++有任何关系,而是在具有特定天气等特定编译器的平台上使用C++ ...... (4认同)
  • @Luchian:就像我刚才说的那样,它是C++中未定义的行为.在某个编译器下在您的计算机上工作的方式与C++*语言*无关. (4认同)
  • @luchian:定义"工作".对我来说,"作品"的意思是"按照明确的行为做我所期望的".你在`a-> foo()`中有未定义的行为; [我写了一整个问答](http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined- behav).如果你不关心未定义的行为,那很好,但是你已经失去了参数(和代码的质量!). (2认同)

Naw*_*waz 12

parashift FAQ:

成员函数说删除这个是合法的(和道德的)吗?

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

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

  • 你必须绝对100%肯定这个对象是通过new(不是new [],也不是通过放置new,也不是堆栈上的本地对象,也不是全局,也不是​​另一个对象的成员;但是通过普通的普通新).

  • 您必须绝对100%肯定您的成员函数将是在此对象上调用的最后一个成员函数.

  • 您必须绝对100%确定您的其他成员函数(在删除此行之后)不会触及此对象的任何部分(包括调用任何其他成员函数或触摸任何数据成员).

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

  • 你做得很好......但结局是错误的.你可以用`this`指针做任何你想做的事情,不涉及解引用它.具体来说,你所有的例子"与另一个指针比较,与NULL比较,打印它"等等实际上是非常安全的. (3认同)
  • Naveaz前三个子弹是绝对正确的:) (2认同)