首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++0x中删除nullptr仍然安全吗?

问在c++0x中删除nullptr仍然安全吗?
EN

Stack Overflow用户
提问于 2011-07-18 10:09:08
回答 2查看 80.4K关注 0票数 106

在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++更符合语言的既定设计目标。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-18 10:21:50

5.3.5/7说:

如果delete-表达式的操作数的值不是null指针值,则delete-表达式将调用一个去分配函数(3.7.4.2)。否则,取消分配函数是否会被调用,这是fi的问题。

3.7.4.2/3说:

提供给去分配函数的first参数的值可以是空指针值;如果是,如果解除分配函数是标准库中提供的函数,则调用无效。

因此,只要使用了标准的去分配函数,或者用户提供的去分配函数正确地处理空指针,行为就会被很好地定义。

票数 121
EN

Stack Overflow用户

发布于 2011-07-18 10:52:36

另一方面,

需要删除空指针才没有效果,这意味着要进行额外的运行时检查。

新的措辞不会删除对空指针的运行时检查。相反,草案标准更接近于说一个实现必须进行一个空指针测试才能兼容。

同样值得注意的是,旧的标准自相矛盾,因为它说(5.3.5/2)“如果删除操作数的值是空指针,则操作无效”,但后来说(5.3.5/7)“删除-表达式将调用取消分配函数”。调用函数是一种效果。这一点尤其如此,因为调用的函数很可能是重写的operator delete。

新的措辞消除了这一矛盾,在删除空指针的情况下,要由实现来显式地调用解除分配函数。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6731331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档