【问题标题】:in C++, why can't an object be freed when it's pointer is out of scope在 C++ 中,当对象的指针超出范围时,为什么不能释放对象
【发布时间】:2022-11-16 12:05:44
【问题描述】:

说我有一个方法,然后在方法中新建一个对象

void MyMethod() {
  Obj* p = new Obj();
}

所以当函数结束时,指针将被删除,因为它超出了范围,如果我没有返回 p 指针,那意味着没有这个 Obj 对象的引用,为什么编译器不能为我们删除对象?

因此,如果人们忘记这样做,就不会出现“内存泄漏”。


【问题讨论】:

  • 如果你想要这种行为,你可以写Obj p;,它会在方法结束时处理清理。但有时您需要能够创建一个对象,其生命周期与函数的范围不完全匹配。
  • 确定对象何时泄漏是一个难题(“垃圾收集”)。例如,Obj 可能会创建一个线程并将自己传递给线程,然后在完成后删除自己。从 MyMethod 退出时删除 Obj 会过早释放对象。

标签: c++ pointers compiler-construction


【解决方案1】:

可以用std::unique_ptr!原始指针并不是真正适合现代 C++ 中的日常使用,您需要这样:

#include <memory>

void MyMethod() {
  std::unique_ptr<Obj> p = std::make_unique<Obj>();
   // no leak!
}

或者你也可以只做Obj p;,但我猜你知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2012-04-22
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多