为什么80%的码农都做不了架构师?>>>   

引用计数主要用于自动垃圾回收,C++程序直接运行于cpu,本身是没有垃圾回收功能的,但可以通过引用计数实现一个带半自动垃圾回收功能的类,之所以称之为半自动,典型的是因为它不像java/python那样能处理循环指针(引用)。从C++11,标准库里已经自带了使用引用计数的智能指针std::shared_ptr。

实现引用计数的核心原理是相同的数据对象指针和相同的引用计数器指针一起,当引用对象被创建或被拷贝时,引用计数要加1;当引用对象被销毁或被覆盖时,引用计数减1;当引用计数为0时,数据对象被销毁。细节上要注意的是当引用对象被覆盖时,当前引用计数要先减1。

对应于C++来说,实现引用计数的关键就是构造函数、拷贝构造函数、赋值。代码如下:

template <class T>
class Ref
{T *ptr;     // 数据对象指针int *count; // 引用计数器指针void dec(){if (count){--(*count);if (0 == *count){// 引用计数为0则删除数据对象指针和引用计数器指针delete ptr;ptr = NULL;delete count;count = NULL;}}}void inc(){if (count)++(*count);}public:Ref() : ptr(NULL), count(NULL){}Ref(T *t) // 注意:这里不能传入栈内存指针,由调用方保证。: ptr(NULL), count(NULL) // 构造时先初始化为NULL,再重设指针{reset(t);}~Ref(){dec();}Ref(const Ref &r){*this = r;}Ref &operator=(const Ref &r){dec(); // 先减少当前引用计数ptr = r.ptr;count = r.count;inc();return *this;}void reset(T *t) // 重设当前指针{dec(); // 先减少当前引用计数ptr = t;if (ptr){count = new int;*count = 1;}else count = NULL;}T *get() const{return ptr;}T *operator->() const{return ptr;}T &operator*() const{return *ptr;}int use_count() const{return count ? *count : 0;}
};

转载于:https://my.oschina.net/guzhou/blog/3038070

C++引用计数原理和实现相关推荐

  1. shared_ptr的引用计数原理

    引用计数原理 指向相同资源的所有 shared_ptr 共享"引用计数管理区域",并采用原子操作保证该区域中的引用计数值被互斥地访问."引用计数管理区域"是指通 ...

  2. c++ reference counting引用计数原理

    我们都知道,c++最令人头疼的问题也是被其他语言鄙视的问题--指针管理.而引用技术能够让上面的简化了不少.下面说说c++引用计数的设计原理. 引用计数的两个动机: 1. 简化heap对象周边的记录工作 ...

  3. iOS之深入解析内存管理的引用计数retainCount的底层原理

    一.简介 ① 引用计数概念 OC 在创建对象时,不会直接返回该对象,而是返回一个指向对象的指针. OC 在内存管理上采用了引用计数,它是一个简单而有效管理对象生命周期的方式. 在对象内部保存一个用来表 ...

  4. 智能指针shared_ptr引用计数工作原理

    引用计数原理 shared_ptr的实现是这样的:  shared_ptr模板类有一个__shared_count类型的成员_M_refcount来处理引用计数的问题.__shared_count也是 ...

  5. 【C++】Android (Light)RefBase-sp-wp引用计数-智能指针源码分析

    文章目录 1.RefBase简介 2.RefBase源码分析 3.RefBase使用注意事项 4.总结 1.RefBase简介 什么是RefBase?RefBase是Android中的一个C++类,用 ...

  6. python引用计数的原理_深入Python中引用计数

    在python中的垃圾回收机制主要是以引用计数为主要手段以标记清除和隔代回收机制为辅的手段 .可以对内存中无效数据的自动管理!在这篇文章,带着这个问题来一直往下看:怎么知道一个对象能不能被调用了呢? ...

  7. 【Java 虚拟机原理】垃圾回收算法 ( Java 虚拟机内存分区 | 垃圾回收机制 | 引用计数器算法 | 引用计数循环引用弊端 )

    文章目录 一.Java 虚拟机内存分区 二.垃圾回收机制 三.引用计数器算法 ( 无法解决循环引用问题 ) 一.Java 虚拟机内存分区 Java 虚拟机内存分区 : 所有线程共有的内存区域 : 堆 ...

  8. 引用计数法的原理和优缺点

    垃圾标记阶段:对象存活判断 堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中那些是存活对象,哪些是已经死亡的对象.只有被标记为已经死亡的对象,GC才会在垃圾回收过程时 ...

  9. Java引用计数与实现

    引用计数(Reference Counting)可作为内存管理办法,也是老代jvm垃圾回收策略之一,原理简单但是仍有广泛的引用,如OkHttp,netty等. 回收原理 对象在创建实例的时候会在堆内存 ...

最新文章

  1. 卡尔曼滤波与组合导航原理_卫星知识科普:一种基于卫星共视的卡尔曼滤波算法!...
  2. 替换系统wsock32.dll,实现封包拦截
  3. 制作首页的显示列表。
  4. BZOJ2654: tree 二分答案+最小生成树
  5. windows 服务 定时程序 跑不出数据
  6. PyTorch中的梯度微分机制
  7. CDH秘籍(两):cloudera Manager存储监控数据
  8. App.config配置详解
  9. Java 反射 面试题
  10. centos6.5安装自动化工具ansible和图形化工具tower
  11. Spark RDD的Transformation操作
  12. thx是什么意思_在高数中thx表示什么意思-thx-数学-别杂南同学
  13. 分布式应用:从CAP理论到PACELC理论
  14. VMware虚拟机ping不通主机,Destination Host Unreachable
  15. 目的地址,源地址防火墙双向nat转换
  16. 谷歌自动翻译-谷歌翻译api怎样能打开网页默认自动翻译
  17. android手机系统也属于操作系统吗,国产手机操作系统yunOS是独立系统吗?网友:想多了,是安卓系统...
  18. 从零开始的板绘入门!
  19. 自助取款属于计算机应用领域,300道计算机应用习题(含答案)讲述.doc
  20. html基础、css基础(前端基础知识入门)

热门文章

  1. Leetcode 刷题记录
  2. 【SAP-SD】合同与发运协议的区别
  3. 批量识别图片文字并存为Excel,几行Python轻松实现!
  4. 高分辨率屏幕下vm安装xp的解决方案
  5. OneNote重装或升级版本后如何同步之前的在线笔记?
  6. 客户问我,他都已经提供了那么多硬盘,你们之前也说可以存满90天,为什么监控录像还是没有90天?
  7. 计算机上如何转换搜狗,无法切换到搜狗输入法怎么办
  8. Problem Driven Pattern, Coaching Pattern Series
  9. 浅谈5G通信面临的电磁兼容挑战及解决方法
  10. 什么是敏捷开发,敏捷开发落地指南之迭代排期