成员函数中“删除此”的有用性

时间:2010-12-15 11:54:40

标签: c++ this delete-operator

  

可能重复:
  Is it OK to use "delete this" to delete the current object?
  Should objects delete themselves in C++?

我刚刚在programmers.stackexchange上遇到this问题,并看到了在成员函数中执行delete this;的问题。

据我所知,这通常是禁止的,但是在某些情况下,这可能是有用的。什么时候会有用呢?没有这样做的技术原因是什么?

3 个答案:

答案 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,它允许消息决定是自行删除(异步)还是取消阻止发送者(同步)。