可能重复:
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(); }
};
答案 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!
}