删除空指针是否安全?

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


当前回答

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

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

其他回答

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

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

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

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

delete std::exchange(heapObject, nullptr);

是的,它是安全的。

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


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

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;
}

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

有一个关于这个问题的常见问题解答。

c++语言保证如果p是,删除p将什么都不做 null。因为你可能把测试搞反了,因为大多数测试 方法迫使您显式地测试每个分支点 不应把多余的如果测试。