我首先要说的是,使用智能指针,您将永远不必担心这个问题。
以下代码有什么问题?
Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
这是由 an answer and comments 引发的另一个问题。来自 Neil Butterworth 的一条评论产生了一些赞成票:
Setting pointers to NULL following delete is not universal good practice in C++. There are times when it is a good thing to do, and times when it is pointless and can hide errors.
在很多情况下它没有帮助。但根据我的经验,这不会造成伤害。谁给我解惑一下。
最佳答案
将指针设置为 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
来了解共享所有权,或其他智能指针实现,具体取决于您的需要。
关于c++ - 删除指针后将其设为 NULL 是一个好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54851358/