Man*_*rse 73 c++ null language-lawyer delete-operator
在c++03
它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2
:
在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.
然而,在目前的草案对于c++0x
这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x
,如果是,在哪里?
笔记:
有大量的间接证据表明它仍然有明确的定义.
首先,有两句话§5.3.5/2
说明
在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,...
和
在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或...
这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.
其次,改变意义delete 0
是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变.此外,没有提到这是c++0x
草案兼容性附件(附件C)的重大变化.但是,附件C是一个信息性部分,因此对标准没有任何解释.
另一方面,删除空指针要求无效的事实意味着额外的运行时检查.在很多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突.也许委员会刚刚决定改变行为,使标准c ++更符合语言的既定设计目标.
int*_*jay 90
5.3.5/7说:
如果delete-expression的操作数的值不是空指针值,则delete-expression将调用释放函数(3.7.4.2).否则,是否未调用是否将调用释放功能.
并且3.7.4.2/3说:
提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.
因此,只要使用标准释放函数,或者用户提供的释放函数正确处理空指针,行为就可以很好地定义.
另一方面,删除空指针要求无效的事实意味着额外的运行时检查.
新的措辞不会删除空指针的运行时检查.反过来说:草案标准更接近于说实现必须使空指针测试符合要求.
还值得注意的是:旧标准自相矛盾,因为它说(5.3.5/2)"如果删除操作数的值是空指针,则操作无效"但后来说(5.3.5/7) "delete-expression将调用deallocation函数." 调用函数是一种效果.特别是这样,因为被调用的函数很可能被覆盖operator delete
.
新的措辞消除了这种矛盾,明确地将其留给实现是否在删除空指针的情况下调用释放函数.