引用计数原理

shared_ptr的实现是这样的:  shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题。__shared_count也是一个模板类,它的内部有一个指向Sp_counted_base_impl类型的指针_M_pi。所有引用同一个对象的shared_ptr都共用一个_M_pi指针。

指向相同资源的所有 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引用计数工作原理相关推荐

  1. c++智能指针与引用计数

    一. 引用计数 先写一个简单的学生类 #include<iostream> #include <string.h> using namespace std;class stud ...

  2. VTK修炼之道80:VTK开发基础_智能指针与引用计数

    1.引用计数 VTK经过多年的开发与维护,已经形成了一套稳定的框架和开发规则.因此,了解这些规则和框架是定制VTK类的基础,这其中用到了大量面向对象的设计模式,例如对象工程模式.观察者/命令模式:还有 ...

  3. 智能指针shared_ptr的原理、用法和注意事项

    智能指针shared_ptr的原理.用法和注意事项 1 前言 2 shared_ptr原理 3 shared_ptr的基本用法 3.1 初始化 3.2 获取原始指针 4 智能指针和动态数组 4.1 c ...

  4. C++智能指针: shared_ptr 实现详解

    文章目录 shared_ptr描述 声明 作用 原理实现 函数使用 关于shared_ptr循环引用问题 shared_ptr描述 声明 shared_ptr属于C++11特性中新加的一种智能指针,它 ...

  5. 智能指针shared_ptr的用法

    智能指针shared_ptr的用法 2016-12-03 15:39 by jiayayao, 360 阅读, 0 评论, 收藏, 编辑 为了解决C++内存泄漏的问题,C++11引入了智能指针(Sma ...

  6. 智能指针shared_ptr、unique_ptr、weak_ptr

    智能指针 智能指针解决的问题 智能指针分类 shared_ptr 内存模型图 shared_ptr示例 shared_ptr含义 shared_ptr基本用法及常用函数 常用函数 智能指针的构造,初始 ...

  7. 智能指针(shared_ptr、unique_ptr、weak_ptr)的使用

    智能指针的使用 一.shared_ptr 1.创建一个shared_ptr 2.shared_ptr的常用成员函数 reset成员函数的使用 3.==注意事项== 二.unique_ptr 1.uni ...

  8. Boost智能指针——shared_ptr

    boost::scoped_ptr虽然简单易用,但它不能共享所有权的特性却大大限制了其使用范围,而boost::shared_ptr可以解决这一局限.顾名思义,boost::shared_ptr是可以 ...

  9. 标准库中的智能指针shared_ptr

    智能指针的出现是为了能够更加方便的解决动态内存的管理问题.注:曾经记得有本书上说可以通过vector来实现动态分配的内存的自动管理,但是经过试验,在gcc4.8.5下是不行的.这个是容易理解的,vec ...

最新文章

  1. python制作桑基图_Python制作桑基图
  2. java socket抓取资源_Java 通过 Socket 的形式抓取网页内容
  3. 【原】storm源码之一个class解决nimbus单点问题
  4. 分布式session之token解决方案实现
  5. 浅析WebRtc中视频数据的收集和发送流程
  6. ‘ascii‘ codec can‘t encode characters in position
  7. vlan间路由的问题
  8. MessageFormat 格式化String
  9. 互联网系统架构的演进
  10. 信创产业已成现象级新风口 代码“源头”安全该如何守护?
  11. 程序员面试金典——17.1无缓存交换
  12. Java通过JNI调用C++的DLL库
  13. 蜗轮蜗杆计算软件_微型直流电机减速比计算方法
  14. STM32 外部中断
  15. 翻译: 4.1 多层感知器MLP Multilayer Perceptrons pytorch
  16. 11 EDA技术实用教程【时序电路的Verilog设计2】
  17. oracle 10g varchar2与varchar有什么区别
  18. 金融知识图谱的现状与展望
  19. C语言游戏设计——扫雷
  20. 入门者必备——fpga芯片速度等级认识

热门文章

  1. Team System:基本 Power Tool 工具。
  2. http协议1.0和1.1的区别
  3. 寄存器,锁存器,触发器,储存器 区分
  4. 人类月球日 | 专访邹海洋:中国的航天梦,是信任与不辜负的故事
  5. Kali 如何放大字体与图标
  6. Windows Phone 8107更新方法
  7. UVa 10387 - Billiard
  8. 机器学习和深度学习相关问题总结
  9. VPS服务-Docker搭建个人博客网站
  10. 用Javascript实现鼠标经过某一行,那一行变色