C++ 在多大程度上使用;删去这句话;符合C++;标准

C++ 在多大程度上使用;删去这句话;符合C++;标准,c++,C++,在对象中实现引用计数时,“释放并可能删除对象”原语通常是这样实现的: void CObject::Release() { --referenceCount; if( referenceCount == 0 ) { delete this; } } 首先,删除这个看起来很可怕。但是由于member函数立即返回,并且不尝试访问任何成员变量,因此这些东西仍然可以正常工作。至少通常是这样解释的。成员函数甚至可能调用某个全局函数来写入日志,表明它删除了对象 < C+

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

void CObject::Release()
{
    --referenceCount;
    if( referenceCount == 0 ) {
       delete this;
    }
}
首先,
删除这个
看起来很可怕。但是由于member函数立即返回,并且不尝试访问任何成员变量,因此这些东西仍然可以正常工作。至少通常是这样解释的。成员函数甚至可能调用某个全局函数来写入日志,表明它删除了对象

< C++ >标准是否保证成员函数可以调用<代码>删除此< /代码>,然后执行任何不需要访问成员变量和调用成员函数的操作,这将定义正常行为?

参见

我没有该标准的副本,但我可以通过谷歌搜索找到的最好的“参考”是

引述上文:

现在我想知道C++标准中是否有任何东西 这保证了“删除此;”不会使程序崩溃 当函数返回时

没有人能给你这样的保证,因为它会崩溃

不符合标准。标准很清楚 唯一的问题是对象是否在删除后使用。和 该标准还非常清楚地说明了(在§3.2/2中)当物体 是“用过的”,而不是


是的,这将表现为删除任何其他对象。

此问题有许多含义,在Scott Meyers书的第27项(10页)中有最好的介绍:

如果你没有这本书,就把它和它的前身一起买

它们不是“如何”编程学习书籍,而是提供清晰、直接(并解释)的建议应该做什么不应该做什么

编辑

该项目简要介绍了:

  • 第27项要求或禁止基于堆的对象-
段落标题为:

  • 需要基于堆的对象
  • 确定对象是否在堆上
  • 禁止基于堆的对象
其中一个问题是,您不能删除在堆栈上创建的对象(不使用
new
创建的本地对象)-这是一种非法情况,会导致崩溃。但这些项目还有更多的含义


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

相关:什么是“做任何不需要访问成员变量和调用成员函数的事情”的意思?不取消对
的引用,无论是隐式的还是显式的。该页面没有引用标准。这是很好的采取一些家伙的话(当然,一个家伙谁是在C++标准委员会),但我怀疑夏普牙想看到证据本身。该页面导致另一个问题:堆栈溢出是一个地方找到答案,而不是一个地方找到一些东西,最终导致答案。如果你的答案只是一个链接,请提供一个关于链接的概要。史提夫:技术上任何人都可以参加C++标准会议。但是他有没有发表过一些有开创性的论文?有什么能引起讨论的吗?史蒂夫:是的,这不是对标准的引用,但我身上没有标准的副本,所以我只能这样做了。我明白了@Rob:当然,但是C++ FAQ是一个众所周知的网站,并且已经比StAcExobe的时间长了很多。但为了完整性,链接描述了在C++中是否“合法删除”这一点是合法的。请您提供迈尔斯所说的摘要。至少,告诉我们“第27项”的标题是什么,这样我们就可以知道期待什么和寻找什么。