使用“删除此”符合C ++标准的程度如何?

时间:2009-12-08 10:53:15

标签: c++

在对象中实现引用计数时,“release and possible delete object”原语通常如下所示实现:

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

首先,delete this看起来很吓人。但是由于成员函数立即返回并且不尝试访问任何成员变量,所以这些东西仍然可以正常工作。至少这是通常解释的方式。成员函数甚至可以调用一些全局函数来写入删除对象的日志。

C ++标准是否保证成员函数可以调用delete this然后执行任何不需要访问成员变量和调用成员函数的事情,这将被定义为正常行为?

3 个答案:

答案 0 :(得分:6)

请参阅C++ FAQ

我没有该标准的副本,但我在谷歌搜索中找到的最佳“参考”是this

引用上述内容:

  
    
      

所以现在我想知道C ++标准中是否有任何内容       这保证了“删除这个;”不会崩溃程序       当函数返回时。

    
         

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

  
     

不符合标准。标准很清楚   唯一的问题是如果在删除后使用该对象。而且   标准也明确说明(在§3.2/ 2中)一个对象   是“被使用”,当它不是。

答案 1 :(得分:3)

这个问题有很多含义,在Scott Meyers的第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 ++程序员都应该知道这些书。他们不会花太多时间。

答案 2 :(得分:1)

是的,这就像删除任何其他对象一样。