在对象中实现引用计数时,“release and possible delete object”原语通常如下所示实现:
void CObject::Release()
{
--referenceCount;
if( referenceCount == 0 ) {
delete this;
}
}
首先,delete this
看起来很吓人。但是由于成员函数立即返回并且不尝试访问任何成员变量,所以这些东西仍然可以正常工作。至少这是通常解释的方式。成员函数甚至可以调用一些全局函数来写入删除对象的日志。
C ++标准是否保证成员函数可以调用delete this
然后执行任何不需要访问成员变量和调用成员函数的事情,这将被定义为正常行为?
答案 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
他们不是“如何”编写学习书籍,而是提供明确,直接(和解释)的建议该做什么和不该做什么。
修改强>:
该项目非常简短:
段落标题为:
其中一个问题是,您不能删除在堆栈上创建的对象(不使用new
创建的本地对象) - 这是一种非法情况,会导致崩溃。但是这个项目有更多的含义。
我只能重复一遍:每个C ++程序员都应该知道这些书。他们不会花太多时间。
答案 2 :(得分:1)
是的,这就像删除任何其他对象一样。