C++ 删除空指针安全吗?

C++ 删除空指针安全吗?,c++,pointers,memory-management,null-pointer,delete-operator,C++,Pointers,Memory Management,Null Pointer,Delete Operator,删除空指针安全吗 这是一种好的编码方式吗?删除空指针没有效果。它不一定是好的编码风格,因为它不需要,但也不坏 如果你正在寻找好的编码实践,考虑使用智能指针,这样你就根本不需要代码>删除< /> >。它不一定是好的编码风格,因为它不需要,但也不坏 如果你在寻找好的编码实践,考虑使用智能指针,这样你就根本不需要代码>删除< />代码。< /P> < P>是的,它是安全的。 删除空指针没有害处;如果将未分配的指针初始化为零,然后简单地删除,则通常会减少函数尾部的测试数量 由于前一句话引起了混乱,下面

删除空指针安全吗


这是一种好的编码方式吗?

删除空指针没有效果。它不一定是好的编码风格,因为它不需要,但也不坏


如果你正在寻找好的编码实践,考虑使用智能指针,这样你就根本不需要代码>删除< /> >。它不一定是好的编码风格,因为它不需要,但也不坏

如果你在寻找好的编码实践,考虑使用智能指针,这样你就根本不需要代码>删除< />代码。< /P> < P>是的,它是安全的。 删除空指针没有害处;如果将未分配的指针初始化为零,然后简单地删除,则通常会减少函数尾部的测试数量


由于前一句话引起了混乱,下面举一个例子来说明所描述的内容,这并非例外:

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

是,它是安全的

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


由于前一句话引起了混乱,下面举一个例子来说明所描述的内容,这并非例外:

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-“[…]中的任何一种 或者,操作数的值 of delete可以是空指针 值[…'”

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

顺便说一句,C标准$7.20.3.2还说空指针上的“free”不起作用

自由函数使空间 ptr指出要解除分配, 也就是说,可供进一步使用 分配。如果ptr是空指针, 没有动作发生


来自C++0x标准草案

$5.3.5/2-“[…]中的任何一种 或者,操作数的值 of delete可以是空指针 值[…'”

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

顺便说一句,C标准$7.20.3.2还说空指针上的“free”不起作用

自由函数使空间 ptr指出要解除分配, 也就是说,可供进一步使用 分配。如果ptr是空指针, 没有动作发生


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

我还希望默认情况下
delete
将参数设置为NULL,如中所示

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

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

delete
执行检查,因此在您这边检查它会增加开销,看起来更难看。非常好的做法是在
delete
之后将指针设置为NULL(有助于避免重复删除和其他类似的内存损坏问题)

我还希望默认情况下
delete
将参数设置为NULL,如中所示

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

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

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

我经历过删除[]NULL(即数组语法)是不安全的(VS2010)。 我不确定这是否符合C++标准。< /P>
可以安全地删除NULL(标量语法).

除非重载delete运算符,否则它是安全的。如果重载delete运算符而不处理null条件,则它根本不安全。

除非重载delete运算符,否则它是安全的。如果重载delete运算符而不处理null条件,则它根本不安全。

作为补充,在C++14中您可以使用以下构造:

delete std::exchange(heapObject, nullptr);
作为补充,在C++14中,您可以使用以下结构:

delete std::exchange(heapObject, nullptr);
在这件事上有一个答案来回答这个问题

C++语言保证如果P是P,则删除P将不起作用。 null。因为您可能会得到向后的测试,并且因为大多数测试 方法强制您显式地测试每个分支点,您可以 不应进行冗余if测试

在这件事上有一个答案来回答这个问题

C++语言保证如果P是P,则删除P将不起作用。 null。因为您可能会得到向后的测试,并且因为大多数测试 我