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。因为您可能会得到向后的测试,并且因为大多数测试 我