删除空指针是否安全?
这是一种好的编码风格吗?
删除空指针是否安全?
这是一种好的编码风格吗?
当前回答
有一个关于这个问题的常见问题解答。
c++语言保证如果p是,删除p将什么都不做 null。因为你可能把测试搞反了,因为大多数测试 方法迫使您显式地测试每个分支点 不应把多余的如果测试。
其他回答
删除空指针没有任何作用。这不一定是好的编码风格,因为它不是必需的,但也不坏。
如果你正在寻找好的编码实践,可以考虑使用智能指针,这样你就根本不需要删除。
来自c++ 0x标准草案。
$5.3.5/2 - "[…])在 可选项,操作数的值 的delete可以是空指针 价值。[…”
当然,没有人会“删除”一个NULL值的指针,但这样做是安全的。理想情况下,不应该有删除NULL指针的代码。但在循环中删除指针(例如在容器中)时,它有时是有用的。由于删除NULL指针值是安全的,因此可以真正编写删除逻辑,而无需显式检查要删除的NULL操作数。
顺便说一句,C标准$7.20.3.2还说,NULL指针上的'free'没有任何动作。
自由函数产生空间 被PTR指去卸除, 也就是说,可供进一步使用 分配。如果ptr是空指针, 没有动作发生。
无论如何,Delete都会执行检查,所以在您这边检查会增加开销,而且看起来更难看。一个很好的做法是在删除后将指针设置为NULL(有助于避免重复删除和其他类似的内存损坏问题)。
我也喜欢默认情况下删除是设置参数为NULL像在
#define my_delete(x) {delete x; x = NULL;}
(我知道R和L值,但这不是很好吗?)
为了补充ruslik的回答,在c++ 14中你可以使用这样的结构:
delete std::exchange(heapObject, nullptr);
我有经验,它是不安全的(VS2010)删除[]NULL(即数组语法)。 我不确定这是否符合c++标准。
删除NULL(标量语法)是安全的。