删除空指针是否安全?

删除空指针是否安全?

这是一个很好的编码风格?

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

我也喜欢如果delete默认情况下设置参数为NULL,如in

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

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

从C ++ 0x草案标准。

$ 5.3.5 / 2 – “[…]在任何一种情况下,delete操作数的值都可以是一个空指针值。[…'”

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

顺便说一下,C标准$ 7.20.3.2也说,空指针上的'free'没有任何作用。

自由函数使ptr指向的空间被释放,也就是说,可用于进一步的分配。 如果ptr是空指针,则不会发生任何操作。

是的,这是安全的。

删除空指针并没有什么坏处, 如果将未分配的指针初始化为零,然后简单地删除,它通常会减少函数尾部的测试次数。


既然前面的句子引起了混淆,一个例子 – 这并不是特别安全的 – 正在描述的是:

 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操作不需要测试它们在源代码中是否为非空; 库代码无论如何执行该检查。

删除一个空指针没有效果。 编码风格不是必须的,因为它不是必需的,但也不错。

如果您正在寻找良好的编码习惯,请考虑使用智能指针,所以您根本不需要delete

除非重载删除操作符,否则它是安全的。

我已经经历过,删除[] NULL(即数组语法)是不安全的(VS2010)。 我不确定这是否符合C ++标准。

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

为了补充ruslik的答案,在C ++ 14中,你可以使用这个构造:

 delete std::exchange(heapObject, nullptr);