std::shared_ptr 如何释放?

Dmi*_*ano 9 c++ c++17

下面的代码什么时候发生内存释放?

#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;
}
Run Code Online (Sandbox Code Playgroud)

如下从这篇文章 std::make_shared执行一个堆分配。这是否意味着在至少有一个std::weak_ptr存活之前,内存不能被释放?

Ser*_*eyA 4

(由于我没有正确阅读问题,因此必须编辑答案)。

是的,内存本身将在您的代码片段中,因为您已经通过make_shared调用为控制块和对象分配了一个块。

  • 通常,“std::make_shared”同时具有控制块和对象空间是一件好事。但是在某些情况下(例如大量寿命较长的弱指针和寿命较短​​的强共享指针),闲置控制块的开销是可以接受的,但对象的闲置空间则不能接受,那么故意不使用“std::make_shared”并执行以下操作两步法是一个合理的替代方案。 (2认同)