我刚刚看到他们delete this;
在类函数中完成的一些代码,我知道这不是一个好的设计,但它定义了会发生什么,可以说类总是来自某个地方的指针。它总是会以正确的方式被删除吗?
class A
{
public:
void abort() { delete this; }
};
class B
{
void func() { A* a = new A; a->abort(); }
};
我刚刚看到他们delete this;
在类函数中完成的一些代码,我知道这不是一个好的设计,但它定义了会发生什么,可以说类总是来自某个地方的指针。它总是会以正确的方式被删除吗?
class A
{
public:
void abort() { delete this; }
};
class B
{
void func() { A* a = new A; a->abort(); }
};
它在 C++ 中是完全合法的,delete this
并且实际上对于某些模式(如智能指针)非常有用。但是,开发人员有责任确保没有其他方法被调用,或者在this
删除发生后将访问实例数据的堆栈上。
C++ FAQ Lite 有一个值得一读的条目
这不是delete this;
糟糕的设计,它绝对不会导致未定义的行为。它做了你所期望的——它删除了这个对象。这意味着您最好确保delete this
在调用该对象后不对对象执行任何其他操作。
Microsoft MFC 类delete this;
广泛使用,例如在 CWnd(窗口)类中。当窗口接收到 WM_DESTROY 消息时,不再需要窗口包装类(即 C++ 对象是什么),因此它调用delete this;
(我认为在PostNcDestroy()
类似的地方)。从框架用户的角度来看,它非常简洁:您只需要记住,有一些方法可以让 C++ 对象自动删除,并且在窗口生命周期即将结束时要小心一点。
我相信还有很多其他的现实世界的例子delete this;
是一个有用的范例。
是的。您只需要注意,在delete
语句之后没有使用实例变量(我认为也没有虚拟方法),因为this
在delete
.
是的,应该正常删除。
在某些情况下这很有用,但需要格外小心,以确保在此之后永远不会访问该对象。
正如评论者指出的那样,如果在删除后没有调用其他成员,则没有未定义的行为如果您不访问对象的其他成员,您将能够继续使用该函数。
在这种特殊情况下没关系,但想想如果a
是自动变量会发生什么:
void foo() {
A a;
a.abort(); // BOOM!
}