为了账号安全,请及时绑定邮箱和手机立即绑定

删除空指针安全吗?

删除空指针安全吗?

C++
长风秋雁 2019-07-01 16:39:22
删除空指针安全吗?删除空指针安全吗?这是一种很好的编码风格吗?
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

delete无论如何,都要执行检查,所以在您的一侧检查它会增加开销,而且看起来更丑。一个非常良好做法是将指针设置为空。delete(有助于避免双重删除和其他类似的内存损坏问题)。

我也希望delete默认情况下,参数设置为NULL,如

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

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


查看完整回答
反对 回复 2019-07-01
?
Helenr

TA贡献1780条经验 获得超4个赞

从C+0x草案标准。

$5.3.5/2-“[.]在这两种选择中,删除操作数的值可能是空指针值。[.‘”

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

顺便提一下,C Standard$7.20.3.2还说,空指针上的“空闲”不起作用。

自由函数使PTR所指向的空间被释放,也就是说,可以用于进一步的分配。如果PTR是空指针,则不会发生任何操作。


查看完整回答
反对 回复 2019-07-01
?
忽然笑

TA贡献1806条经验 获得超5个赞

是的很安全。

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


由于上一句造成了混乱,因此有一个例子-也不是例外安全-说明了所描述的内容:

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

可以使用示例代码选择各种类型的nit,但概念(我希望如此)是清楚的。指针变量初始化为零,以便delete函数末尾的操作不需要测试它们在源代码中是否为非空;库代码无论如何都会执行该检查。


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 531 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信