c++如何使用std::shared_ptr_c++引用计数智能指针详解【核心】-C++

std::shared_ptr通过独立控制块管理引用计数,强引用归零时析构对象并释放控制块;make_shared更高效且防异常泄漏,但需避免裸指针重复构造、循环引用及this误用。

std::shared_ptr 是怎么管理引用计数的

它不是靠指针本身存计数,而是额外分配一块控制块(control block),里面放引用计数、弱引用计数、析构器、分配器等信息。每次拷贝 std::shared_ptr,控制块里的强引用计数就 +1;每次离开作用域或被赋值为 nullptr,就 -1;减到 0 时,自动 delete 所管理的对象,并释放控制块。

  • 控制块和对象可以分开分配(默认行为),也可能合并在一次 new 中(用 std::make_shared 时)——后者更高效,但要注意:如果对象构造抛异常,控制块仍会泄漏(C++17 起已修复)
  • 引用计数操作是原子的,所以 std::shared_ptr 可在多线程中安全拷贝/赋值,但指向的 *对象本身不自动线程安全*
  • 不要混用裸指针初始化:int* p = new int(42); auto sp1 = std::shared_ptr<int>(p); auto sp2 = std::shared_ptr<int>(p);</int></int> ——这会创建两个独立控制块,双重 delete

什么时候必须用 std::make_shared 而不是 new + 构造函数

绝大多数情况都该用 std::make_shared:它把对象和控制块一次分配,避免两次内存申请,也杜绝了因异常导致的资源泄漏风险(比如构造函数抛异常时,裸 new 分配的内存可能没被接管)。

  • 例外:需要自定义删除器且不能默认构造(std::make_shared 不接受删除器参数),此时只能用 std::shared_ptr<t>(new T, my_deleter)</t>
  • 注意:不能对数组用 std::make_shared<int>()</int> ——C++17 前不支持,即使支持,std::shared_ptr 也不带 [] 删除语义,应改用 std::shared_ptr<int></int> + 自定义删除器
  • std::make_shared 完转发参数给 T 的构造函数,完美支持 explicit 构造、初始化列表、移动语义

std::shared_ptr 和 std::weak_ptr 配合破循环引用的关键点

循环引用不是“两个 shared_ptr 互相持有”,而是“两个对象通过 shared_ptr 成员彼此持有对方”,导致引用计数永远不归零。解决方式是其中一方改用 std::weak_ptr ——它不增加强引用计数,只在需要时调用 lock() 升级为 shared_ptr。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » c++如何使用std::shared_ptr_c++引用计数智能指针详解【核心】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997682+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997682+
  • 本周更新: 0+
  • 最后更新: 2026-03-16