13

可能重复:
使用“delete this”删除当前对象可以吗?

我刚刚看到他们delete this;在类函数中完成的一些代码,我知道这不是一个好的设计,但它定义了会发生什么,可以说类总是来自某个地方的指针。它总是会以正确的方式被删除吗?

class A
{
 public:
    void abort() { delete this; }
};

class B
{
    void func() { A* a = new A; a->abort(); }
};
4

6 回答 6

17

它在 C++ 中是完全合法的,delete this并且实际上对于某些模式(如智能指针)非常有用。但是,开发人员有责任确保没有其他方法被调用,或者在this删除发生后将访问实例数据的堆栈上。

C++ FAQ Lite 有一个值得一读的条目

于 2010-11-29T16:27:35.273 回答
2

这不是delete this;糟糕的设计,它绝对不会导致未定义的行为。它做了你所期望的——它删除了这个对象。这意味着您最好确保delete this在调用该对象后不对对象执行任何其他操作。

Microsoft MFC 类delete this;广泛使用,例如在 CWnd(窗口)类中。当窗口接收到 WM_DESTROY 消息时,不再需要窗口包装类(即 C++ 对象是什么),因此它调用delete this;(我认为在PostNcDestroy()类似的地方)。从框架用户的角度来看,它非常简洁:您只需要记住,有一些方法可以让 C++ 对象自动删除,并且在窗口生命周期即将结束时要小心一点。

我相信还有很多其他的现实世界的例子delete this;是一个有用的范例。

于 2010-11-29T16:32:55.873 回答
1

是的。您只需要注意,在delete语句之后没有使用实例变量(我认为也没有虚拟方法),因为thisdelete.

于 2010-11-29T16:28:41.810 回答
1

是的,应该正常删除。

在某些情况下这很有用,但需要格外小心,以确保在此之后永远不会访问该对象。

于 2010-11-29T16:29:14.257 回答
0

正如评论者指出的那样,如果在删除后没有调用其他成员,则没有未定义的行为如果您不访问对象的其他成员,您将能够继续使用该函数。

于 2010-11-29T16:26:56.070 回答
0

在这种特殊情况下没关系,但想想如果a是自动变量会发生什么:

void foo() {
    A a;
    a.abort(); // BOOM!
}
于 2010-11-29T16:31:07.253 回答