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