为什么即使仍然存在弱指针,make_shared 也会调用析构函数?

Fra*_*o.S 2 c++ shared-ptr make-shared

make_shared()从理论上讲,和之间的一个区别shared_ptr是内存分配技术。make_shared()应该使用单个块,而shared_ptr应该使用两个块。

一个make_shared()缺点应该是,即使有一个活着的内存也无法释放weak_ptr

有人可以解释为什么这个程序的输出总是相同的,独立于我用来创建的函数shared_ptr

#include <iostream>
#include <memory>

class mc
{
    public:
      mc(int p):p_{p} {std::cerr<<"Constructor"<<std::endl;}
      ~mc() { std::cerr<<"Destructor"<<std::endl;}    
    private:
      int p_;    
};

std::weak_ptr<mc> wp3;

int main()
{
 
    auto sp=std::make_shared<mc>(4);
    auto sp2=sp;
    auto sp3{sp};
    wp3=std::weak_ptr<mc>{sp};
    
    sp2.reset();
    sp3.reset();
    sp.reset();
     
    for (int i =0;i< 5;i++) {std::cerr<<sp.use_count()<<std::endl;}   

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期待最后调用析构函数方法,因为它weak_ptr仍然存在,为什么没有发生?

Chr*_*ial 11

即使它的内存无法被释放,shared_ptr当(非弱)引用计数达到零时,a 持有的对象仍然会被销毁。对象销毁和内存释放是两个独立的操作,不需要同时发生。

一般来说,由于“一次分配”行为make_shared是一种优化,因此它不应该对您的代码产生明显的影响。