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

删除指针后将其空设为空是很好的做法吗?

删除指针后将其空设为空是很好的做法吗?

C++ C
慕少森 2019-07-11 16:23:53
删除指针后将其空设为空是很好的做法吗?我先说,使用智能指针,您就不必担心这个问题了。下面的代码有什么问题?Foo * p = new Foo;// (use p)delete p;p = NULL;这是由回答和评论另一个问题。一条评论来自尼尔·巴特沃斯引起了一些不满:在C+中,在DELETE之后将指针设置为NULL并不是普遍的良好做法。有时它是一件好事,有时它是没有意义的,可以隐藏错误。在很多情况下,这都无济于事。但以我的经验来看,不会有什么伤害的。有人启发我。
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

将指针设置为0(在标准C+中为“NULL”,C中的NULL定义有点不同),避免了双删除的崩溃。

考虑以下几点:

Foo* foo = 0; // Sets the pointer to 0 (C++ NULL)
delete foo; // Won't do anything

鉴于:

Foo* foo = new Foo();
delete foo; // Deletes the object
delete foo; // Undefined behavior

换句话说,如果不将已删除的指针设置为0,则如果执行双删除操作,则会遇到麻烦。反对在删除后将指针设置为0的一个论点是,这样做只是掩盖了双重删除错误,并使它们得不到处理。

很明显,最好不要有双重删除错误,但取决于所有权语义和对象生命周期,这在实践中是很难实现的。与UB相比,我更喜欢蒙面双删除错误。

最后,在管理对象分配方面,我建议您看看std::unique_ptr对于严格的/单一的所有权,std::shared_ptr对于共享所有权或其他智能指针实现,则取决于您的需要。


查看完整回答
反对 回复 2019-07-11
?
浮云间

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

我有一个更好的最佳实践:尽可能结束变量的作用域!

{
    Foo* pFoo = new Foo;
    // use pFoo
    delete pFoo;}


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

添加回答

举报

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