c++ - 删除指针后将其设为 NULL 是一个好习惯吗?

标签 c++ pointers null dynamic-allocation

我首先要说的是,使用智能指针,您将永远不必担心这个问题。

以下代码有什么问题?

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/

相关文章:

c++ - QGraphicsScene::addItem: 项目已经被添加到这个场景

c++ - 下载 C++ 文件(没有外部库)

c - 根据结构体内部的元素对结构体指针数组进行排序

pointers - 默认情况下,指针是否在方法内部取消引用?

C- 交换结构数组内的字符串或数字的决策函数

java - 将对象设置为null以及Java中的程序流程

c - 如何在 C 中将结构体指针设置为 NULL?

c++ - 在变量中存储多个值

c++ - 前向声明?包括守卫?或其他什么?

c++ - 使用 std::less 创建一个 std::map 环绕原点