98

c++03很明显,删除空指针没有任何效果。事实上,它明确指出§5.3.5/2

在任一替代方案中,如果 delete 的操作数的值是空指针,则该操作无效。

然而,在目前的草案c++0x中似乎缺少了这句话。在草案的其余部分,我只能找到说明如果删除表达式的操作数不是空指针常量会发生什么的句子。是否删除仍定义在 中的空指针c++0x,如果是,在哪里?

笔记:

有重要的间接证据表明它仍然是明确定义的。

首先,有两句话§5.3.5/2说明

在第一种选择(删除对象)中,删除操作数的值可能是空指针值,...

在第二种选择(删除数组)中,删除操作数的值可能是空指针值或...

这些说允许操作数为空,但它们本身并没有真正定义如果它是会发生什么。

其次,改变 的含义delete 0是一个重大的重大改变,标准委员会不太可能做出这种特殊的改变。c++0x此外,草案的兼容性附件(附件 C)中没有提到这是一个重大变化。然而,附录 C 是一个信息性部分,因此这与标准的解释无关。

另一方面,要求删除空指针无效的事实意味着额外的运行时检查。在很多代码中,操作数永远不能为空,因此这种运行时检查与零开销原则相冲突。也许委员会只是决定改变行为以使标准 c++ 更符合语言的既定设计目标。

4

2 回答 2

115

5.3.5/7 说:

如果 delete-expression 的操作数的值不是空指针值,则 delete-expression 将调用释放函数 (3.7.4.2)。否则,未指定是否将调用释放函数。

3.7.4.2/3 说:

提供给释放函数的第一个参数的值可能是空指针值;如果是这样,并且如果释放函数是标准库中提供的函数,则调用无效。

所以行为是很好定义的,只要使用标准的释放函数,或者用户提供的释放函数正确处理空指针。

于 2011-07-18T10:21:50.603 回答
9

另一方面,要求删除空指针无效的事实意味着额外的运行时检查。

新措辞不会删除空指针的运行时检查。反过来说:标准草案更接近于说实现必须使空指针测试符合要求。

同样值得注意的是:旧标准自相矛盾,它说(5.3.5/2)“如果 delete 的操作数的值是空指针,则操作无效”,但后来又说(5.3.5/7) “删除表达式将调用释放函数。” 调用函数是一种效果。尤其如此,因为被调用的函数很可能是一个被覆盖的operator delete.

新的措辞消除了这种矛盾,明确地让实现在删除空指针的情况下是否调用释放函数。

于 2011-07-18T10:52:36.677 回答