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

Ton*_*ion 8 c++ this delete-operator

可能重复:
使用"删除此项"删除当前对象是否可以?
对象是否应该在C++中删除自己?

我刚刚在programmers.stackexchange上遇到过这个问题,并且看到了关于在delete this;成员函数内部进行操作的问题.

根据我的理解,这通常是禁止的,但是在某些情况下这可能是有用的.什么时候会有用,哪些技术原因没有?

Moo*_*ice 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
Run Code Online (Sandbox Code Playgroud)

也就是说,在C++中我们有智能指针(例如boost::shared_ptr)来管理对象的生命周期.鉴于COM是进程间的,并且可以从VB等语言访问,因此智能指针不是设计团队的选择.


dor*_*ron 5

delete this;通常用于参考计数模式.当对象的引用计数降至零时,该对象将自行删除.如果没有进一步参考被删除的对象,则完全可以.它还要求所述对象驻留在堆/免费存储上.

  • 堆.你的意思是对象必须驻留在堆上.或者在c ++规范中已知:免费商店. (2认同)