c++ - 为什么即使还有弱指针,make_shared 也会调用析构函数?

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

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;
}

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

最佳答案

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

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

https://stackoverflow.com/questions/75250585/

相关文章:

.net - 如何避免 .NET RegEx 类中的无限循环?

.net - 投票 : What do you call your business layer b

performance - Oracle/PLSQL 性能

iphone - 检查输入的文字是否只使用英文字母

sql - 从 SQL 中的逗号分隔值获取第一个或第二个值

nlp - 自然语言中的范围歧义

asp.net-mvc - ASP.NET MVC 中的 POST-redirect-GET 有什么

latex - LaTeX 环境中的多个命令

.net - Winform 样式问题 : Windows classics style?

user-interface - 愚蠢且令人沮丧的跨浏览器 UI 问题