shared_ptr通过引用计数和控制块实现共享所有权,use_count跟踪共享对象的指针数量,对象析构时自动释放资源;make_shared将对象与控制块内存合并,提升性能;多线程下引用计数操作原子安全,但共享对象访问需额外同步;循环引用导致内存泄漏,可用weak_ptr打破循环。

智能指针 shared_ptr 的核心目标是实现对象的共享所有权,确保资源在所有持有者都不再使用时自动释放。它通过引用计数机制来管理动态分配的对象生命周期。
引用计数机制
每个 shared_ptr 实例指向一个控制块(control block),该控制块包含:
- 引用计数(use_count):记录当前有多少个 shared_ptr 共享同一个对象。
- 删除器(deleter):自定义资源释放逻辑,比如 delete、free 或其他清理函数。
- 弱引用计数(weak_count):用于支持 weak_ptr。
当一个新的 shared_ptr 共享对象时,use_count 增加;当 shared_ptr 被销毁或重新赋值时,use_count 减少。一旦 use_count 变为 0,控制块会调用删除器释放所管理的对象。
控制块的分配方式
控制块可以与对象一起分配(make_shared 优化)或单独分配:
立即学习“C++免费学习笔记(深入)”;
美易企业内容管理系统(原美易企业建站系统),是我们结合多年企业建站经验,专门针对中小企业,自主开发的快速建站程序,具有操作简便,扩展功能强大,模板使用简单,网站后续维护成本低等优点,得到众多企业用户的好评。美易企业内容管理系统,所有功能的实现均使用HTML、CSS、JS来实现,完全不需要去修改程序,让用户技术要求更低,使用更简单,功能扩展更方便。程序优势对比美易系统,使用简单:考虑到企业网站管理人
- 使用 make_shared
() 时,对象和控制块被分配在同一块内存中,减少内存开销并提升性能。 - 直接用 shared_ptr
(new T) 时,控制块和对象是分开分配的,效率稍低。
线程安全性
shared_ptr 的引用计数操作是原子的(在大多数标准库实现中),这意味着多个线程同时修改不同的 shared_ptr 实例(指向同一对象)是安全的。但注意:
- 对同一个 shared_ptr 对象的并发读写仍需加锁。
- 所管理对象本身的线程安全由用户负责。
循环引用问题
当两个对象通过 shared_ptr 相互引用时,引用计数无法归零,导致内存泄漏。解决方法是使用 weak_ptr 打破循环。weak_ptr 不增加引用计数,只观察对象是否存在。
基本上就这些:shared_ptr 靠引用计数 + 控制块实现自动内存管理,配合 make_shared 提高性能,用 weak_ptr 避免循环引用。不复杂但容易忽略细节。










