删除NULL指针是否安全?

时间:2010-11-16 02:33:27

标签: c++ pointers memory-management null-pointer delete-operator

删除NULL指针是否安全?

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

8 个答案:

答案 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 测试。