我首先要说的是,使用智能指针,您永远不必担心这一点。
下面的代码有什么问题?
Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
这是由an answer and comments引发的另一个问题。来自Neil Butterworth的一条评论产生了一些好评:
在C++中,在delete之后设置指向NULL的指针并不是通用的良好做法。有时它是一件好事,有时它是毫无意义的,并且可以隐藏错误。
在很多情况下,它都不会有帮助。但根据我的经验,这不会有什么坏处。谁来开导我。
发布于 2009-12-19 07:01:40
将指针设置为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
,或者其他智能指针实现,具体取决于您的需求。
发布于 2009-12-19 06:55:08
在删除指针所指向的内容后,将指针设置为NULL当然不会有什么坏处,但在一个更基本的问题上,这通常是一个创可贴:为什么要首先使用指针?我可以看到两个典型的原因:
std::vector
的工作方式,它解决了意外地留下指向释放的内存的指针的问题。没有指针,,
new
返回的指针可能与调用delete
的指针不同。多个对象可能同时使用了该对象。在这种情况下,最好使用共享指针或类似的指针。我的经验法则是,如果你在用户代码中留下指针,你就做错了。指针不应该一开始就指向垃圾。为什么没有一个对象来负责确保它的有效性?当指向的对象结束时,它的作用域为什么不结束呢?
发布于 2009-12-19 06:49:38
我有一个更好的最佳实践:尽可能结束变量的作用域!
{
Foo* pFoo = new Foo;
// use pFoo
delete pFoo;
}
https://stackoverflow.com/questions/1931126
复制相似问题