删除NULL指针是否安全?
这是一种很好的编码风格吗?
答案 0 :(得分:235)
delete
执行检查,因此在您身边检查会增加开销并且看起来更加丑陋。 非常良好做法是在delete
之后将指针设置为NULL(有助于避免双重删除和其他类似的内存损坏问题)。
如果delete
默认情况下将参数设置为NULL,我也很喜欢
#define my_delete(x) {delete x; x = NULL;}
(我知道R和L值,但不是很好吗?)
答案 1 :(得分:73)
来自C ++ 0x草案标准。
$ 5.3.5 / 2 - “[...]其中一个 替代方案,操作数的值 删除可以是空指针 值。[...'“
当然,没有人会对具有NULL值的指针进行“删除”,但这样做是安全的。理想情况下,不应该有删除NULL指针的代码。但是当在循环中删除指针(例如在容器中)时,它有时是有用的。由于删除NULL指针值是安全的,因此可以在没有显式检查要删除的NULL操作数的情况下编写删除逻辑。
另外,C标准$ 7.20.3.2也表示NULL指针上的'free'不执行任何操作。
自由功能导致空间 ptr指出要解除分配, 也就是说,可用于进一步 分配。如果ptr是空指针, 没有动作。
答案 2 :(得分:43)
是的,这是安全的。
删除空指针没有坏处;如果将未分配的指针初始化为零然后简单地删除,它通常会减少函数尾部的测试次数。
由于上一句话引起了混淆,因此所描述内容的一个例子 - 这并非例外安全:
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;
}
可以使用示例代码选择各种类型的nits,但概念(我希望)清楚。指针变量初始化为零,因此函数末尾的delete
操作不需要测试它们在源代码中是否为非空;无论如何,库代码执行该检查。
答案 3 :(得分:20)
删除空指针无效。这不是一个好的编码风格,因为它不是必需的,但它也不错。
如果您正在寻找良好的编码实践,请考虑使用智能指针,这样您根本不需要delete
。
答案 4 :(得分:5)
为了补充ruslik的答案,在C ++ 14中你可以使用这种结构:
delete std::exchange(heapObject, nullptr);
答案 5 :(得分:3)
除非您重载了删除操作符,否则它是安全的。如果你重载了delete操作符而没有处理null条件那么它根本就不安全。
答案 6 :(得分:0)
我经历过不安全(VS2010)删除[] NULL(即数组语法)。 我不确定这是否符合C ++标准。
可以安全地删除NULL(标量语法)。
答案 7 :(得分:0)
关于这个问题有一个 FAQ 可以回答这个问题。
<块引用>C++ 语言保证如果 p 是,delete p 什么都不做 无效的。由于您可能会倒退测试,并且由于大多数测试 方法论迫使你明确地测试每个分支点,你 不应该放入多余的 if 测试。