【问题标题】:Should we NULL every raw pointer after it is used?我们应该在使用后将每个原始指针设为 NULL 吗?
【发布时间】:2022-01-21 10:44:35
【问题描述】:
int *a;
if (true)
    *a = 2;
else
    *a = 3;

如您所见,a 不是动态分配的指针。我应该在退出之前将其分配给nullptr 吗? unique_ptr 会自动为我做吗? a 指向的内存指针呢?如果我在 a 超出范围之前为空,会导致内存泄漏吗?

【问题讨论】:

  • 那个代码是 UB,a 没有指向任何东西。
  • 你想达到什么目标?您提议的更改以何种方式影响目标?为什么要使用unique_ptr?这和你的目标有关吗?内存泄漏是如何发生的?这些都是或多或少独立的问题,您可以独立研究。不过,其中大部分都是常见问题解答,因此请从这里开始。
  • 您的代码不需要您的编译器将其转换为任何有效的东西(未定义的行为)。将nullptr 分配给指针在某些情况下可能有意义在使用delete 运算符 以允许编译器警告您在某些情况下意外访问已删除的对象,或者至少使代码崩溃,而不是对内存访问的影响一无所知,但std::unique_ptr 不会“帮助”任何相关的事情; std::unique_ptr 只是明确所有权并确保在其拥有的对象上调用 delete 运算符...
  • 顺便说一句:内存泄漏,即使设置为 null:void f() { int* p = new int; p = nullptr; } 即使未设置为 null,也没有内存泄漏:void f() { int* p = new int; delete p; }
  • a 指向的内存指针呢? 由于a 未初始化,它并不指向int .你的编译器应该已经警告你了。打开编译器警告。修复警告。

标签: c++ pointers unique-ptr


【解决方案1】:
int *a;
if (true)
    *a = 2;

此程序的行为未定义。 a 没有有效的指针值,所以你不能间接通过。

是否应该在使用后将每个原始指针清空?

这取决于。例如,如果指针的生命周期即将结束,则将其分配为 null 是多余的。

unique_ptr 会自动为我做吗?

unique_ptr 不是原始指针。

但是不,unique_ptr 不知道你是否停止使用它,所以当你停止使用它时它不能将自己设置为 null。

如果我在 a 超出范围之前为空,会导致内存泄漏吗?

将指针设置为 null 与在指针超出范围之前不将其设置为 null 没有区别。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2016-07-16
    • 2011-02-23
    • 2011-10-04
    • 1970-01-01
    • 2014-04-02
    • 2012-07-02
    相关资源
    最近更新 更多