在c++03中,很明显删除空指针没有任何效果。事实上,在§5.3.5/2中明确指出:
如果删除操作数的值为空指针,则操作无效。
但是,在当前的draft for c++0x中,这个句子似乎缺失了。在草案的其余部分,我只能找到句子,说明如果delete-表达式的操作数不是null指针常量,会发生什么。删除c++0x中仍然定义的空指针吗?如果是,在哪里?
备注:
有大量的间接证据表明,它的定义仍然很明确。
首先,§5.3.5/2中有两句话:
在第一个选项(delete对象)中,delete操作数的值可以是空指针值,
和
在第二个选项(删除数组)中,删除操作数的值可以是空指针值或.
这些操作数表示允许操作数为null,但它们本身并不实际定义如果操作数为null会发生什么。
其次,改变delete 0的含义是一项重大的重大变革,标准委员会不太可能做出这一特定的改变。此外,没有提到这是对c++0x草案的兼容性附件(附件C)的重大改变。不过,附件C是一节内容丰富的内容,因此这与对标准的解释无关。
另一方面,删除空指针不需要生效这一事实意味着额外的运行时检查。在许多代码中,操作数永远不会为空,因此这个运行时检查与零开销原则相冲突。也许委员会只是决定改变行为,使标准的c++更符合语言的既定设计目标。
发布于 2011-07-18 10:21:50
5.3.5/7说:
如果delete-表达式的操作数的值不是null指针值,则delete-表达式将调用一个去分配函数(3.7.4.2)。否则,取消分配函数是否会被调用,这是fi的问题。
3.7.4.2/3说:
提供给去分配函数的first参数的值可以是空指针值;如果是,如果解除分配函数是标准库中提供的函数,则调用无效。
因此,只要使用了标准的去分配函数,或者用户提供的去分配函数正确地处理空指针,行为就会被很好地定义。
发布于 2011-07-18 10:52:36
另一方面,
需要删除空指针才没有效果,这意味着要进行额外的运行时检查。
新的措辞不会删除对空指针的运行时检查。相反,草案标准更接近于说一个实现必须进行一个空指针测试才能兼容。
同样值得注意的是,旧的标准自相矛盾,因为它说(5.3.5/2)“如果删除操作数的值是空指针,则操作无效”,但后来说(5.3.5/7)“删除-表达式将调用取消分配函数”。调用函数是一种效果。这一点尤其如此,因为调用的函数很可能是重写的operator delete。
新的措辞消除了这一矛盾,在删除空指针的情况下,要由实现来显式地调用解除分配函数。
https://stackoverflow.com/questions/6731331
复制相似问题