2010-12-15 71 views
8

可能重复:
Is it OK to use "delete this" to delete the current object?
Should objects delete themselves in C++?有用的成员函数 '删除'

我只是碰到this问题一提出programmers.stackexchange,看到的问题关于做一个delete this;里面的成员函数。

从我所了解的情况来看,这通常是一个禁忌,然而在某些情况下这可能会有用。什么时候这样做会有用,以及没有这样做的技术原因是什么?

+0

另请参阅http://stackoverflow.com/q/1866193/57428和http://stackoverflow.com/q/1866461/57428 – sharptooth 2010-12-15 12:11:01

回答

5

一般来说,这是一个坏主意,因为当你在技术上处于成员函数内部时,并且突然该类的每个成员现在都失效了。很显然,如果你在拨打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等语言访问,智能指针不是设计团队的选择。

+0

我相信它实际上使用InterlockedDecrement,即原子减量,否则它不会是线程安全的。另外,AddRef和Release是m_nRefs可变的const函数,或者不能复制对象并正确增加引用计数。 – CashCow 2010-12-15 12:31:20

+0

@CashCow,你是对的,但我只是将它作为一个例子来展示,而不是展示COM使用的*精确*代码,但是我修改了我的答案以表明它是假设的。 – 2010-12-15 12:33:02

0

我在我的消息处理中使用它。它是pre shared_ptr,它允许消息决定是否自己删除(异步)或解除阻止发送者(同步)。

5

delete this;通常用于引用计数模式。当其引用计数降至零时,该对象将自行删除。如果没有进一步提及被删除的对象,那完全没问题。它还要求所述对象驻留在堆/免费商店中。

+2

堆。你的意思是对象必须驻留在堆上。或者是在C++规范中已知的:免费商店。 – 2010-12-15 12:04:36

+0

@ Lenny222不,它必须分配新的删除删除。 – CashCow 2010-12-15 12:31:58

+0

@Elemental - 修正 – doron 2010-12-15 12:57:22