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++免费学习笔记(深入)”;
使用 make_shared() 时,对象和控制块被分配在同一块内存中,减少内存开销并提升性能。 直接用 shared_ptr(new T) 时,控制块和对象是分开分配的,效率稍低。
线程安全性
shared_ptr 的引用计数操作是原子的(在大多数标准库实现中),这意味着多个线程同时修改不同的 shared_ptr 实例(指向同一对象)是安全的。但注意:
对同一个 shared_ptr 对象的并发读写仍需加锁。 所管理对象本身的线程安全由用户负责。
循环引用问题
当两个对象通过 shared_ptr 相互引用时,引用计数无法归零,导致内存泄漏。解决方法是使用 weak_ptr 打破循环。weak_ptr 不增加引用计数,只观察对象是否存在。
基本上就这些:shared_ptr 靠引用计数 + 控制块实现自动内存管理,配合 make_shared 提高性能,用 weak_ptr 避免循环引用。不复杂但容易忽略细节。
以上就是c++++智能指针shared_ptr的实现原理_c++ shared_ptr实现原理的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477541.html
微信扫一扫
支付宝扫一扫