使用“delete this”符合C++标准的程度是多少?

3

在对象中实现引用计数时,“释放并可能删除对象”的原语通常是这样实现的:

void CObject::Release()
{
    --referenceCount;
    if( referenceCount == 0 ) {
       delete this;
    }
}

首先,delete this 看起来很可怕。但是由于成员函数立即返回并且不尝试访问任何成员变量,所以这个东西仍然可以正常工作。至少通常是这样解释的。该成员函数甚至可能调用一些全局函数来写入日志,表示它已删除了对象。
C++标准是否保证成员函数可以调用 delete this,然后执行任何不需要访问成员变量和调用成员函数的操作,并且这将被定义为正常行为?

相关:https://dev59.com/43I-5IYBdhLWcg3wbHq- - jldupont
“不需要访问成员变量和调用成员函数即可执行任何操作”是什么意思? - anon
不要对this进行解引用,无论是隐式还是显式的。 - Pavel Minaev
3个回答

6
请参考C++ FAQ
我没有标准的副本,但是通过谷歌搜索,我能找到最好的“参考”这里
以上引用如下:
所以现在我想知道C ++标准中是否有任何保证“delete this;”在函数返回时不会导致程序崩溃。
没有人能给您这样的保证,因为它可能会崩溃。
根据标准,不会出现上述情况。标准非常清楚地指出,唯一的问题是如果在delete之后继续使用对象。同时,在§3.2/2中,标准也明确说明了何时使用对象以及何时不使用对象。

1
那个页面没有引用标准。听取某个人的话(虽然这个人曾经是C++标准委员会的成员)固然好,但我怀疑Sharptooth想要亲眼看到证据。 - Steve Jessop
那个页面引导到另一个问题:https://dev59.com/jnI-5IYBdhLWcg3wbHm- - sharptooth
Stack Overflow旨在成为一个寻找答案的地方,而不是寻找最终导致答案的地方。如果您的答案只是一个链接,请提供该链接内容的摘要。 - Rob Kennedy
@Steve:从技术上讲,任何人都可以参加C++标准会议。但他有贡献过任何开创性的论文吗?有没有引起过讨论的东西?我不知道,只是在问一下。 - Martin York
@Steve:是的,这不是对标准的引用,但我没有标准副本在身边,所以那是我能做到的最好的。收到。@Rob:当然,但C++ FAQ是一个众所周知的网站,比stackoverflow存在时间更长。但为了完整起见,该链接描述了在C++中执行“delete this”是否合法。 - Alok Singhal

3
这个问题有很多含义,在Scott Meyers的书《更有效的C++:35种提高程序和设计的新方法》中最好涵盖了第27项(10页): More Effective C++: 35 New Ways to Improve Your Programs and Designs 如果您没有这本书,购买它以及它的前作 Effective C++: 55 Specific Ways to Improve Your Programs and Designs 它们不是“如何”编程学习书籍,而是给出明确、直接(并解释)建议,告诉您该做什么和不该做什么。
编辑:
项目简要包括:
第27项 要求或禁止基于堆的对象-
段落标题为:
要求基于堆的对象 确定对象是否在堆上 禁止基于堆的对象

其中一个问题是,您不应删除在堆栈上创建的对象(不使用 new 创建的本地对象)-这是一种非法情况,会导致崩溃。但是,这些项目还有更多的影响。

我只能重复自己:每个C ++程序员都应该了解这些书籍。它们不会花费您太多时间。


1
请您提供Meyers的观点摘要好吗?至少可以告诉我们“条款27”的标题是什么,这样我们就可以知道期望和寻找什么了。 - Rob Kennedy

1

是的,它会像删除任何其他对象一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接