如果在C ++中删除它会发生什么

时间:2010-11-29 16:23:40

标签: c++ memory this delete-operator

  

可能重复:
  Is it OK to use “delete this” to delete the current object?

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

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

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

6 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:2)

delete this;不是设计不好的情况,并且肯定不会导致未定义的行为。它完成了你所期望的 - 它删除了这个对象。这意味着你最好确保在调用delete this之后你不再对该对象做任何其他事情。

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

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

答案 2 :(得分:1)

是。您只需要注意,delete语句之后不会使用任何实例变量(我认为没有虚拟方法),因为this指针在delete之后将不再有效}。

答案 3 :(得分:1)

是的,应该正常删除。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

void foo() {
    A a;
    a.abort(); // BOOM!
}
相关问题