最佳答案
在 c++03
中,删除空指针显然没有效果。事实上,§5.3.5/2
明确指出:
在这两种情况下,如果 delete 操作数的值是 null 指针,则操作没有效果。
然而,在目前的 草稿 for c++0x
中,这个句子似乎缺失了。在草案的其余部分,我只能找到一些句子来说明如果 Delete-expression 删除表达式的操作数不是空指针常量会发生什么。删除空指针是否仍然在 c++0x
中定义,如果是,在哪里?
备注:
有相当多的间接证据表明,它仍有明确的定义。
首先,在 §5.3.5/2
中有两个句子说明
在第一种选择(delete 对象)中,delete 操作数的值可以是空指针值,..。
还有
在第二种选择(delete 数组)中,delete 操作数的值可以是空指针值或..。
它们表示允许操作数为 null,但是它们本身并不实际定义如果为 null 会发生什么。
其次,改变 delete 0
的含义是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变。此外,在 c++0x
草案的兼容性附件(附件 C)中没有提到这是一个突破性的变化。然而,附录 C 是一个信息部分,所以这与标准的解释没有关系。
另一方面,要求删除空指针不产生任何效果的事实意味着额外的运行时检查。在许多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突。也许委员会只是决定改变行为,使标准 c + + 更加符合语言的设计目标。