【发布时间】:2020-11-30 21:42:33
【问题描述】:
以下代码中的内存释放何时发生?
#include <memory>
int main()
{
auto p = std::make_shared<int>(5);
std::weak_ptr<int> wp = p;
p = nullptr;
return wp.lock() == nullptr ? 0 : 1;
}
如下来自this post std::make_shared 执行一个堆分配。这是否意味着在至少有一个std::weak_ptr 还活着之前,内存不能被释放?
【问题讨论】:
-
在所有 shared_ptr 被破坏或重置后,weak_ptr 将保持内存中的 控制块“活动”,直到所有弱指针都被破坏。使用
make_shared将在一次分配中为对象分配控制块和空间,因此weak_ptr 将保留控制块的内存和被破坏的对象的内存,直到所有weak_ptr 都被破坏。 -
@Eljay 我预计会发生某种奇迹,但你让我失望了...... :)
-
唉,C++ 中没有奇迹。不过,有很多令人难以置信的聪明东西!我听说过尝试将 垃圾收集 与 C++ 结合,但我自己还没有尝试过那种内存管理奇迹。