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和c++编译器之gcc和mingw

    三大编译器:gcc,llvm,clang 什么是gcc? gcc 官方网站:https://gcc.gnu.org GCC(GNU Compiler Collection,GNU编…

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

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

    C++ 2023年5月29日
    061
  • 设置c++中cout输出的字体颜色

    一种方法是通过右键控制台进行颜色设置,但是这种方法的问题在于它是全局的,没有具体文字的区分。另外一种方法就是使用代码来修改,本文主要介绍的就是这种方法。 最重要的函数是SetCon…

    C++ 2023年5月29日
    050
  • C#与C++之间类型的对应

    Windows Data Type .NET Data Type BOOL, BOOLEAN Boolean or Int32 BSTR String BYTE Byte CHAR…

    C++ 2023年5月29日
    084
  • c++ lambda捕获this 导致多线程下类释放后还在使用的错误

    但是需要注意的是,这里捕获this,不是以一种拷贝的方式,更像是一种引用(或者别名,描述可能不准确),当在外面这个类的生命周期结束时,lambda内部还在调用这个类的成员函数,那么…

    C++ 2023年5月29日
    054
  • C++ 内存池 — C++ Memory Pool

    这是我翻译的文章,来自 Code Project, 原文作者: DanDanger2000. 原文链接: http://www.codeproject.com/cpp/Memory…

    C++ 2023年5月29日
    082
  • C++11智能指针处理Array对象

    //C++11的//完全可以避免写手动的delete代码,//但是它默认使用delete删除对象,//如果是数组对象,需要指定自定义的删除方法,支持delete[]std::sha…

    C++ 2023年5月29日
    042
  • c++对象工厂

    一.简单工厂 #pragma once struct IObjectA { virtual void Test1()=0; }; class ObjectA:public IObj…

    C++ 2023年5月29日
    056
  • 代朋友发招聘信息,C++程序员

    急招:高级C/C++程序员工作职能:1、开发工具(地图编辑,动作编辑器等)的维护及新版本的开发。2、Symbian、WM新游戏开发要求:1、精通C/C++语言;2、强烈的责任心和认…

    C++ 2023年5月29日
    052
  • 设计模式C++实现——工厂模式

    软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大…

    C++ 2023年5月29日
    046
  • C++中函数调用时的三种参数传递方式详解

    https://blog.csdn.net/zeng_jun_yv/article/details/98868159?utm_medium=distribute.pc_releva…

    C++ 2023年5月29日
    081
  • CLion之C++框架篇-优化框架,引入boost(三)

    背景 结合上一篇CLion之C++框架篇-优化框架,单元测试(二) ,继续进行框架优化!这一版优化引入一个我们日常经常使用的操作库Boost,估算使用频率在70%以上! Boost…

    C++ 2023年5月29日
    079
  • 开个坑, 写个阿里云开放储存服务(OSS)的C++版SDK以及客户端

    这应该是继我研究手册QQ协议后的第2个稍微正式一点的网络程序, 不只是Scoket套接字编程, 还涉及到更多的HTTP协议知识! 阿里云开放储存服务OSS官方已经提供了不少SDK,…

    C++ 2023年5月29日
    068
  • 如何解释复杂的 C/C++ 声明

    序 1. 基础 2. const修饰符 3. typedef的微妙之处 4. 函数指针 5 左右法则 6. 推荐阅读 我想很多人曾经遇到过像 int * (*fp1) (int) …

    C++ 2023年5月29日
    085
  • windows下使用vscode编写运行以及调试C/C++

    c++本地运行和debughttps://www.cnblogs.com/TAMING/p/8560253.html 运行C++/C代码 在终端运行 文件读入https://blo…

    C++ 2023年5月29日
    050
  • C++多线程库的常用类 std::mutex

    格式:类名 + 头文件 + 用例 + 解释说明 解释说明: std::mutex C++提供的互斥量,用在多线程编程中,来保护共享数据。 C++中通过实例化 std::mutex创…

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