C++ 引用计数

原址: https://blog.csdn.net/u012501459/article/details/48229399

C++没有像java那样的垃圾回收机制,但是我们可以实现一个。一种很简单的方式就是使用引用计数。它实际上是一种用对象来管理资源的方式,因为普通的栈上的对象在离开作用域时会调用对应的析构函数,根据这个特性,可以实现用于对指针进行管理的类。

下面以一个对int*指针的管理来说明引用计数是如何实现的。

当我们创建一个int型指针时:int *p=new int(10);

在最后我们需要调用delete p;

通过接下来指定的方式,我们可以不用显示调用delete p;这行代码而又能够释放掉通过new关键字分配的内存,就是通过引用来实现的。

先列出下面一张图表:

C++ 引用计数

上面是我们需要使用的int*指针以及需要定义的两个类Referenced和Ref_ptr类,其实Referenced类对用户而言是不可见的,就是用户在使用引用计数的过程中都不会用到这个类,这个类只在Ref_ptr内部被调用。

执行Ref_ptr r1=new int(4);//调用构造函数

Ref_ptr r2=r1;//调用拷贝构造函数

时的过程如下图:

C++ 引用计数

下面是这两个类的类图:

C++ 引用计数

cpp;gutter:true;</p> <h1>include</h1> <h1>include</h1> <p>using namespace std;</p> <p>class Referenced { public: //初始化这个类,引用计数设为1,并且将p指向传入的地址 Referenced(int * pi) { refCount=1; p=pi; }</p> <pre><code>//引用计数加1 int ref() { return ++refCount; } //引用计数减1 int unref() { return --refCount; } //返回引用计数 int count() { return refCount; } //析构函数,释放掉内存 ~Referenced() { cout<ref();//将它们的应用计数加1 } //赋值操作符,右操作数的引用计数要减1,左操作数的引用计数要加1 Ref_ptr & operator=(const Ref_ptr & rhs) { if(&rhs==this) return *this; if(ptr->unref()==0)//赋值操作符,首先将当前类的引用计数减1 { cout<ref();//引用计数加1 return *this; } //析构函数,引用计数要减1,如果减为0,删除这块内存 ~Ref_ptr() { if(ptr->unref()==0) { cout< </code></pre> <p>

Original: https://www.cnblogs.com/leoking01/p/14591265.html
Author: leoking01
Title: C++ 引用计数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535344/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 客户端单元测试实践——C++篇

    作者 | 思兼来源 | 阿里开发者公众号 背景 我们团队在手淘中主要负责BehaviX模块,代码主要是一些逻辑功能,很少涉及到UI,为了减少双端不一致问题、提高性能,我们采用了将核…

    C++ 2023年5月29日
    070
  • C++11 并发指南后续更新

    C++11 并发指南的第一篇是 2013 年 8 月 3 号写的,到今天(2013 年 8 月 31 号)差不多一个月了,前前后后共写了 8 篇博客介绍 C++11 的并发编程,但…

    C++ 2023年5月29日
    079
  • [转]C++ 模板 静态成员 定义(实例化)

    如果有这样一个模板: 对于以下若干种定义方式,哪些是对的(通过编译)? 为了不影响大家分析判断,我把答案颜色调成比较浅的颜色,下面即是答案: 首先,说明一下三个正确的答案。 第一种…

    C++ 2023年5月29日
    087
  • C++ d-bus 使用实例

    因为以后工作用的到D-bus,这两天抽空看了下c++下得d-bus的使用方法。因为网上对c++下得d-bus使用说明几乎没有,所以,在这里记录下以供同仁使用。同时感谢shengpe…

    C++ 2023年5月29日
    063
  • Floyd算法(二)之 C++详解

    和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授…

    C++ 2023年5月29日
    083
  • 聊聊 C++ 大一统的初始化运算符 {}

    一:背景 最近发现 C++ 中的类型初始化操作,没有 {} 运算符搞不定的,蛮有意思,今天我们就来逐一列一下各自的用法以及汇编展现,本来想分为 &#x503C;&#…

    C++ 2023年5月29日
    030
  • C++ 中 malloc/free与 new/delete区别

    new/delete 通常来说是操作符,就是”+”,”-“一样,malloc/free 是 C++/C 语言的标准库函数 —— 本质…

    C++ 2023年5月29日
    069
  • 设置VS2017 来识别其他文件格式为C++文件

    问题:对于其他库中的文件,如.hpp, .ih 往往由于其他库的文件类型撰写风格,需要在Vs2017中能够类似于C++语法来解析这些文件,则需要如下设置: 打开”工具&…

    C++ 2023年5月29日
    055
  • C++中的float&double的存储原理

    参考:https://cloud.tencent.com/developer/article/1473541 对于任何数字表示成二进制科学计数法以后,一定是1点几(尾数)乘以2的多…

    C++ 2023年5月29日
    044
  • C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Se…

    C++ 2023年5月29日
    085
  • C++的sort函数

    参考: https://baike.baidu.com/item/sort%E5%87%BD%E6%95%B0/11042699?fr=aladdin https://blog.c…

    C++ 2023年5月29日
    070
  • c++以代理的方式来实现接口化编程

    假如你项目代码本身已经实现了很多的实体类,但并未采用接口,可以考虑以这种方式来实现接口化编程 struct ITest { virtual void Test()=0; }; cl…

    C++ 2023年5月29日
    074
  • c++自定义排序_lambda表达式

    class Solution { void quickSort(vector& strs, int l, int r) { if (l >= r) return; i…

    C++ 2023年5月29日
    051
  • 【转】C++右值引用和std::move

    《一文读懂C++右值引用和std::move》 それでも私の大好きな人 posted @2021-03-02 21:29 阿玛尼迪迪 阅读(86 ) 评论() 编辑 Origina…

    C++ 2023年5月29日
    062
  • libnode 0.4.0 发布,C++ 语言版的 Node.js

    libnode 0.4.0 支持 Windows ,提升了性能,libuv 更新到 0.10.17 版本,libj 更新到 0.8.2 版本。 libnode 是 C++ 语言版的…

    C++ 2023年5月29日
    073
  • VS Code C++ 代码格式化方法(clang-format)

    转自:https://blog.csdn.net/core571/article/details/82867932?depth_1-utm_source=distribute.pc…

    C++ 2023年5月29日
    0110
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球