首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >删除指针后将其设为空是一种好的做法吗?

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

Stack Overflow用户
提问于 2009-12-19 06:48:06
回答 17查看 98.1K关注 0票数 164

我首先要说的是,使用智能指针,您永远不必担心这一点。

下面的代码有什么问题?

代码语言:javascript
复制
Foo * p = new Foo;
// (use p)
delete p;
p = NULL;

这是由an answer and comments引发的另一个问题。来自Neil Butterworth的一条评论产生了一些好评:

在C++中,在delete之后设置指向NULL的指针并不是通用的良好做法。有时它是一件好事,有时它是毫无意义的,并且可以隐藏错误。

在很多情况下,它都不会有帮助。但根据我的经验,这不会有什么坏处。谁来开导我。

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-12-19 07:01:40

将指针设置为0(在标准C++中为" NULL“,从C定义的NULL略有不同)可避免在双重删除时崩溃。

请考虑以下几点:

代码语言:javascript
复制
Foo* foo = 0; // Sets the pointer to 0 (C++ NULL)
delete foo; // Won't do anything

鉴于:

代码语言:javascript
复制
Foo* foo = new Foo();
delete foo; // Deletes the object
delete foo; // Undefined behavior 

换句话说,如果你不把删除的指针设置为0,如果你在做双重删除,你就会遇到麻烦。反对在删除后将指针设置为0的论点是,这样做只是掩盖了双重删除错误,而不处理它们。

显然,最好不要有双重删除错误,但根据所有权语义和对象生命周期,这在实践中可能很难实现。比起UB,我更喜欢屏蔽的双重删除错误。

最后,关于管理对象分配的附注,我建议您看一下用于严格/单一所有权的std::unique_ptr,用于共享所有权的std::shared_ptr,或者其他智能指针实现,具体取决于您的需求。

票数 101
EN

Stack Overflow用户

发布于 2009-12-19 06:55:08

在删除指针所指向的内容后,将指针设置为NULL当然不会有什么坏处,但在一个更基本的问题上,这通常是一个创可贴:为什么要首先使用指针?我可以看到两个典型的原因:

  • 你只是想要在堆上分配一些东西。在这种情况下,将其包装在RAII对象中会更安全、更干净。当您不再需要RAII对象时,结束该对象的作用域。这就是std::vector的工作方式,它解决了意外地留下指向释放的内存的指针的问题。没有指针,

  • ,或者你想要一些复杂的共享所有权语义。从new返回的指针可能与调用delete的指针不同。多个对象可能同时使用了该对象。在这种情况下,最好使用共享指针或类似的指针。

我的经验法则是,如果你在用户代码中留下指针,你就做错了。指针不应该一开始就指向垃圾。为什么没有一个对象来负责确保它的有效性?当指向的对象结束时,它的作用域为什么不结束呢?

票数 59
EN

Stack Overflow用户

发布于 2009-12-19 06:49:38

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

代码语言:javascript
复制
{
    Foo* pFoo = new Foo;
    // use pFoo
    delete pFoo;
}
票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1931126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档