可能重复:
Is it OK to use "delete this" to delete the current object?
Should objects delete themselves in C++?
我刚刚在programmers.stackexchange上遇到this问题,并看到了在成员函数中执行delete this;
的问题。
据我所知,这通常是禁止的,但是在某些情况下,这可能是有用的。什么时候会有用呢?没有这样做的技术原因是什么?
答案 0 :(得分:6)
一般来说,这是一个坏主意,因为当你这样做时,你在技术上是在一个成员函数中,突然之间该类的每个成员都是无效的。显然,如果你在delete this;
电话后没有碰到任何东西,你就可以了。但是很容易忘记这些事情,尝试访问成员变量并获得未定义的行为并花时间在调试器上。
也就是说,它在微软的组件对象模型(COM)中被用于释放组件时(注意,这并不像CashCow指出的那样,仅用于说明目的):
void AddRef() { m_nRefs++; }
void Release()
{
m_nRefs--;
if(m_nRefs == 0)
delete this;
// class member-variables now deallocated, accessing them is undefined behaviour!
} // eo Release
也就是说,在C ++中我们有智能指针(例如boost::shared_ptr
)来管理对象的生命周期。鉴于COM是进程间的,并且可以从VB等语言访问,因此智能指针不是设计团队的选择。
答案 1 :(得分:5)
delete this;
通常用于引用计数模式。当对象的引用计数降至零时,该对象将自行删除。如果没有进一步参考被删除的对象,则完全可以。它还要求所述对象驻留在堆/免费存储上。
答案 2 :(得分:0)
我在消息处理中使用它。它是pre shared_ptr,它允许消息决定是自行删除(异步)还是取消阻止发送者(同步)。