删除空指针是否安全?

删除空指针是否安全?

这是一种好的编码风格吗?

200531 次浏览

删除空指针没有任何作用。这不一定是好的编码风格,因为它不是必需的,但也不坏。

如果你正在寻找好的编码实践,可以考虑使用智能指针,这样你就根本不需要delete

是的,它是安全的。

删除空指针没有害处;如果将未分配的指针初始化为零,然后直接删除,则通常会减少函数尾部的测试次数。


由于前面的句子引起了混乱,下面是一个例子——它不是异常安全的——描述的是什么:

void somefunc(void)
{
SomeType *pst = 0;
AnotherType *pat = 0;


…
pst = new SomeType;
…
if (…)
{
pat = new AnotherType[10];
…
}
if (…)
{
…code using pat sometimes…
}


delete[] pat;
delete pst;
}

示例代码中有各种各样的缺陷,但概念(我希望)是清楚的。指针变量被初始化为零,以便函数末尾的delete操作不需要在源代码中测试它们是否为非空;库代码无论如何都会执行该检查。

来自c++ 0x标准草案。

$5.3.5/2 - "[…])在 可选项,操作数的值 的delete可以是空指针 价值。[…”< / p >

当然,没有人会“删除”一个NULL值的指针,但这样做是安全的。理想情况下,不应该有删除NULL指针的代码。但在循环中删除指针(例如在容器中)时,它有时是有用的。由于删除NULL指针值是安全的,因此可以真正编写删除逻辑,而无需显式检查要删除的NULL操作数。

顺便说一句,C标准$7.20.3.2还说,NULL指针上的'free'没有任何动作。

free函数导致空格 被PTR指去卸除, 也就是说,可供进一步使用 分配。如果ptr是空指针,

delete无论如何都会执行检查,所以在你这边检查它会增加开销,看起来更难看。非常的一个良好实践是在delete之后将指针设置为NULL(有助于避免双重删除和其他类似的内存损坏问题)。

我也喜欢delete默认情况下将参数设置为NULL

#define my_delete(x) {delete x; x = NULL;}

(我知道R和L值,但这不是很好吗?)

我有经验,它是安全(VS2010)删除[]NULL(即数组语法)。 我不确定这是否符合c++标准。

安全删除NULL(标量语法)。

它是安全的,除非重载了删除操作符。如果你重载了delete操作符而不处理null条件,那么它就一点也不安全。

为了补充ruslik的回答,在c++ 14中你可以使用这样的结构:

delete std::exchange(heapObject, nullptr);

在这个问题上有一个常见问题解答来回答这个问题。

c++语言保证如果p为,则delete p将不执行任何操作 null。因为你可能把测试搞反了,因为大多数测试 方法迫使您显式地测试每个分支点