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

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

我先说,使用智能指针,您就不必担心这个问题了。

下面的代码有什么问题?

Foo * p = new Foo;// (use p)delete p;p = NULL;

这是由回答和评论另一个问题。一条评论来自尼尔·巴特沃斯引起了一些不满:

在C+中,在DELETE之后将指针设置为NULL并不是普遍的良好做法。有时它是一件好事,有时它是没有意义的,可以隐藏错误。

在很多情况下,这都无济于事。但以我的经验来看,不会有什么伤害的。有人启发我。


慕少森
浏览 515回答 3
3回答

拉丁的传说

将指针设置为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对于共享所有权或其他智能指针实现,则取决于您的需要。

浮云间

我有一个更好的最佳实践:尽可能结束变量的作用域!{     Foo* pFoo = new Foo;     // use pFoo     delete pFoo;}
打开App,查看更多内容
随时随地看视频慕课网APP