智能指针shared_ptr引用计数工作原理
引用计数原理
指向相同资源的所有 shared_ptr 共享“引用计数管理区域”,并采用原子操作保证该区域中的引用计数值被互斥地访问。“引用计数管理区域”是指通过 new 创建的 sp_counted_impl_p<D> 或 sp_counted_impl_pd<D> 对象,在创建成功后立即由其基类指针指向它,而该基类指针被 shared_ptr 间接持有。类之间的关系为:
下面通过一个示例直观地说明引用计数是如何工作的。
示例代码
示例代码解释
第 15 行代码:通过 new 创建一个 A 对象,并将该对象交付给 shared_ptr 进行管理。Sp1 在构造过程中,通过 new 创建了“引用计数管理区域”,对应下图中的 M 对象(M 指的是 sp_counted_impl_p<D> 或 sp_counted_impl_pd<D>,为了方便,后面均称为 M)。M 对象中的数据成员 use_count_:int 正是对象 A 被引用的次数,即引用计数值。通过原子操作保证 use_count_ 被互斥地访问。
第 17 行代码:以 Sp1 作为参数构造一个类型为 shared_ptr<A> 的对象 Sp2,使得 Sp2 亦引用对象 A。此时,Sp1 和 Sp2 都指向了相同的资源(即对象 A)。Sp2 中 sp_counted_base * 类型的数据成员 pn 被拥有与 Sp1 中的 pn 相同的值,这意味着 Sp2 没有另外新建一个“引用计数管理区域”,而是和 Sp1 共享同一个。相应地,“引用计数管理区域”只是把 use_count_ 增1。
第 18 行代码:Sp2 调用 reset,导致 Sp2 不再引用对象 A(下图中 Sp2 和 A 连线为虚线,表示它们之间的引用-被引用关系断绝)。同时,Sp2 也不再同 Sp1 共享“引用计数管理区域”(Sp2 的 sp_counted_base * 类型的数据成员 pn 的值为 0,不指向任何实际存在的对象)。
第 19 行代码:Sp2 在此处析构,Sp2 被销毁(Sp2 的边框设为虚线,表示对象已被销毁)。
第 22 行代码:Sp1 在此处析构,Sp1 被销毁(M 也跟着一起被销毁)。同时,由于 Sp2 是最后一个引用对象 A 的 shared_ptr,所以 A 也被销毁。注意:M 的销毁时机发生在最后一个引用对象 A 的 shared_ptr 销毁时。在本例中,Sp1 只是恰巧作为最后一个引用对象 A 的 shared_ptr 罢了。
智能指针shared_ptr引用计数工作原理相关推荐
- c++智能指针与引用计数
一. 引用计数 先写一个简单的学生类 #include<iostream> #include <string.h> using namespace std;class stud ...
- VTK修炼之道80:VTK开发基础_智能指针与引用计数
1.引用计数 VTK经过多年的开发与维护,已经形成了一套稳定的框架和开发规则.因此,了解这些规则和框架是定制VTK类的基础,这其中用到了大量面向对象的设计模式,例如对象工程模式.观察者/命令模式:还有 ...
- 智能指针shared_ptr的原理、用法和注意事项
智能指针shared_ptr的原理.用法和注意事项 1 前言 2 shared_ptr原理 3 shared_ptr的基本用法 3.1 初始化 3.2 获取原始指针 4 智能指针和动态数组 4.1 c ...
- C++智能指针: shared_ptr 实现详解
文章目录 shared_ptr描述 声明 作用 原理实现 函数使用 关于shared_ptr循环引用问题 shared_ptr描述 声明 shared_ptr属于C++11特性中新加的一种智能指针,它 ...
- 智能指针shared_ptr的用法
智能指针shared_ptr的用法 2016-12-03 15:39 by jiayayao, 360 阅读, 0 评论, 收藏, 编辑 为了解决C++内存泄漏的问题,C++11引入了智能指针(Sma ...
- 智能指针shared_ptr、unique_ptr、weak_ptr
智能指针 智能指针解决的问题 智能指针分类 shared_ptr 内存模型图 shared_ptr示例 shared_ptr含义 shared_ptr基本用法及常用函数 常用函数 智能指针的构造,初始 ...
- 智能指针(shared_ptr、unique_ptr、weak_ptr)的使用
智能指针的使用 一.shared_ptr 1.创建一个shared_ptr 2.shared_ptr的常用成员函数 reset成员函数的使用 3.==注意事项== 二.unique_ptr 1.uni ...
- Boost智能指针——shared_ptr
boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以 ...
- 标准库中的智能指针shared_ptr
智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...
最新文章
- python制作桑基图_Python制作桑基图
- java socket抓取资源_Java 通过 Socket 的形式抓取网页内容
- 【原】storm源码之一个class解决nimbus单点问题
- 分布式session之token解决方案实现
- 浅析WebRtc中视频数据的收集和发送流程
- ‘ascii‘ codec can‘t encode characters in position
- vlan间路由的问题
- MessageFormat 格式化String
- 互联网系统架构的演进
- 信创产业已成现象级新风口 代码“源头”安全该如何守护?
- 程序员面试金典——17.1无缓存交换
- Java通过JNI调用C++的DLL库
- 蜗轮蜗杆计算软件_微型直流电机减速比计算方法
- STM32 外部中断
- 翻译: 4.1 多层感知器MLP Multilayer Perceptrons pytorch
- 11 EDA技术实用教程【时序电路的Verilog设计2】
- oracle 10g varchar2与varchar有什么区别
- 金融知识图谱的现状与展望
- C语言游戏设计——扫雷
- 入门者必备——fpga芯片速度等级认识