C++ '的有用性;删除此';在成员函数中

C++ '的有用性;删除此';在成员函数中,c++,this,delete-operator,C++,This,Delete Operator,可能的重复项: 我刚刚遇到了一个关于programmers.stackexchange的问题,看到了关于做删除这个的问题在成员函数中 据我所知,这通常是一个不,但有一些情况下,这可能是有用的。这样的东西什么时候有用?不这样做的技术原因是什么?我在邮件处理中使用它。它是预共享的\u ptr,它让消息决定是删除自身(异步)还是取消阻止发送方(同步)。一般来说,这是一个坏主意,因为从技术上讲,当你这样做时,你在一个成员函数中,突然该类的每个成员现在都无效。显然,如果您在之后没有触摸任何东西,请删除

可能的重复项:

我刚刚遇到了一个关于programmers.stackexchange的问题,看到了关于做
删除这个的问题在成员函数中


据我所知,这通常是一个不,但有一些情况下,这可能是有用的。这样的东西什么时候有用?不这样做的技术原因是什么?

我在邮件处理中使用它。它是预共享的\u ptr,它让消息决定是删除自身(异步)还是取消阻止发送方(同步)。

一般来说,这是一个坏主意,因为从技术上讲,当你这样做时,你在一个成员函数中,突然该类的每个成员现在都无效。显然,如果您在
之后没有触摸任何东西,请删除此项打电话,你会没事的。但是很容易忘记这些事情,尝试访问成员变量,获得未定义的行为,并花时间在调试器上

也就是说,在发布组件时,它被用于微软的组件对象模型(COM)(注意,这并不是CashCow所指出的那样,只是为了说明目的):


,在C++中,我们有智能指针(例如,代码> Boo::SyrdyPtR/Cuth>)来管理对象的生命周期。考虑到COM是进程间的,可以从VB等语言访问,智能指针不是设计团队的选项。

删除此项通常用于引用计数模式。当引用计数降至零时,对象将删除自身。如果不进一步引用要删除的对象,则完全可以。它还要求所述对象驻留在堆/空闲存储中。

heap。您的意思是对象必须位于堆上。或在C++规范:自由存储中已知的。@ LeNY222,它必须被分配新的,用DELATE删除。也请参阅,我相信它实际上使用了互锁减量,即原子减量,否则它将不是线程安全的。此外,AddRef和Release是常量函数,m_nRefs是可变的,或者您无法复制对象并适当增加它们的引用计数。@CashCow,您是对的,但我只是将其作为示例演示,而不是演示COM使用的确切代码,不过我已修改了我的答案,以表明它是假设性的。
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