2010-11-29 57 views
13

可能重复:
Is it OK to use “delete this” to delete the current object?如果您在C++中删除,这将发生什么

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

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

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

请参阅http://stackoverflow.com/questions/447379/what-is-the-use-of-delete-this/447531#447531 – icecrime 2010-11-29 16:27:40

+1

链接的帖子是相关的,但似乎没有重复。 – 2010-11-29 17:17:26

回答

17

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

的C++ FAQ精简版有此阅读

+3

C++中有很多东西是完全合法的,但仍然是一个糟糕的主意。 – 2010-11-29 17:48:53

0

正如有人所指出的一个评论者有没有未定义的行为,如果没有其他成员被称为后删除 您可以继续功能,如果你不访问对象的其他成员。

+2

只要在`delete`语句之后没有使用成员变量,就可以很好地定义行为。 – MartinStettner 2010-11-29 16:29:19

1

是一个条目,这是值得。您只需要注意,在delete语句后面使用了没有实例变量(我认为没有虚拟方法),因为this指针在delete之后将不再有效。

+0

这不是你必须关心的唯一事情。 – 2010-11-29 17:16:29

1

是的,应该正常删除。

有些情况下这很有用,但需要格外小心以确保该对象在此之后从未被访问。

0

在它是确定这种特殊情况下,但认为如果a是自动变量会发生什么:

void foo() { 
    A a; 
    a.abort(); // BOOM! 
} 
2

这是不是这样说delete this;是糟糕的设计,它肯定不会导致不确定的行为。它做你期望的 - 它删除这个对象。这意味着你最好确保在调用delete this之后不要对该对象进行任何其他操作。

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

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

相关问题