c++实现引用计数

2023-11-13

概述

当有指针指向同一块内存空间时,计数器加1,没增加一个指向该内存空间的指针,计数器加1,同理,当原本指向该内存空间的指针指向另一块内存,计数器减1,被指向的另一个内存的计数器加1。下面是一个引用计数的一种实现。

示例

直接上代码,总共分为三部分,第一部分是基本类的定义,第二部分是对于基本类的使用类,第三部分是实现真正的引用计数功能。

// ReferenceCount.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>

using namespace std;

//基础对象类
class MyPoint
{
public:
    MyPoint(int a = 0,int b = 0):x(a),y(b)
    {

    }
    void setPoint(int a,int b){x = a;y = b;}
    int getX() const {return x;}
    int getY()const {return y;}
private:
    int x;
    int y;
};

//辅助类(共享资源,含有计数和共享的数据资源)
class SharePoint
{
    friend class SmartPtr;//友元函数可以访问类中的私有成员变量
    SharePoint(MyPoint *p):ptr(p),count(0){}
    ~SharePoint()
    {
        if(count == 0)
        {
            delete ptr;
        }
    }
    
    MyPoint *ptr;//共享的数据资源
    int count;//计数
public:
    int getCount()const{return count;}
};

//智能指针类
class SmartPtr
{
public:
    SmartPtr(MyPoint *p):ptr(new SharePoint(p))
    {
        ++ptr->count;
    }
    SmartPtr(const SmartPtr &p)//拷贝构造函数
    {
        ptr = p.ptr;
        ++ptr->count;
    }
    SmartPtr & operator=(const SmartPtr &p)//赋值运算符重载
    {
        if(this->ptr != p.ptr)
        {
            if(--ptr->count == 0)//原来指向的内存空间的计数减1
            {
                delete ptr;
            }
            
            this->ptr = p.ptr;
            ++p.ptr->count;//新指向的内存空间的计数增加1
        }
        return *this;
    }

    SharePoint &operator*()
    {
        return *ptr;
    }
    SharePoint * operator->()
    {
        return ptr;
    }


    ~SmartPtr()
    {
        if(ptr->count == 0)
        {
            delete ptr;
        }
        else
        {
            --ptr->count;
        }
        cout<<"引用计数:"<<ptr->count<<endl;
    }

    SharePoint *getSourcePtr(){return ptr;}
private:
    SharePoint *ptr;
};

//测试引用计数,可以看出引用计数的计数增加于减少
void testReference()
{
    MyPoint p(1,2);
    SmartPtr s1(&p);
    cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
    {
        SmartPtr s2(s1);
        cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
        {
            SmartPtr s3 = s2;
            cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    //以下只能增加引用计数
    //MyPoint p(1,2);
    //SmartPtr s1(&p);
    //cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
    //SmartPtr s2(s1);
    //cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
    //SmartPtr s3 = s2;
    //cout<<"引用计数的个数:"<<s1.getSourcePtr()->getCount()<<endl;
    testReference();

    system("pause");
	return 0;
}

以上代码是在vs2010上实现的,创建的环境是控制台程序,自动生成的项目结构如下:
在这里插入图片描述
以上仅供参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++实现引用计数 的相关文章

随机推荐

  • 例说Hausdorff距离

    给定欧氏空间中的两点集 Hausdorff距离就是用来衡量这两个点集间的距离 其中 称为双向Hausdorff距离 称为从点集A到点集B的单向Hausdorff距离 相应地 称为从点集B到点集A的单向Hausdorff距离 下面从一个例子来
  • adb电池节点

    kernel 4 19 lc drivers power supply mtk battery c static enum power supply property battery props POWER SUPPLY PROP STAT
  • BFS java实现

    public class BFS 存放节点关系的hashtable public static void bfs HashMap
  • java实现视频通话

    首先来确定一下基本思路 一 显示阶段 1 打开摄像头 获得一张BufferedImage1 并获得他的宽 高 2 根据宽 高实例化一个BufferedImage2 3 把BufferedImage1上的每一个像素点画到BufferedIma
  • mysql-锁

    一 基础概念 锁是数据库系统区分与文件系统的一个关键特性 为了保证数据一致性 必须有锁的介入 数据库系统使用锁是为了支持对共享资源进行并发访问 提供数据的完整性和一致性 mysql锁主要是为了解决并发写数据时的一种安全机制 lock与lat
  • ROS导航小车3 odom里程计标定(仅作个人记录)

    检测机器人是否需要标定参考链接 1 打开一个新的terminal 运行rviz rviz窗口打开后 将fixed frame选择为odom 关闭其他所有勾选 只保留grid和tf 如没有grid 左下角add新增 打开tf 下拉出来fram
  • 遗传算法解TSP问题(java实现)

    遗传算法解TSP问题 java实现 TSP问题简介 旅行商问题 最短路径问题 英语 travelling salesman problem TSP 是这样一个问题 给定一系列城市和每对城市之间的距离 求解访问每一座城市一次并回到起始城市的最
  • IDEA打不开(找不到)RunDashBoard问题

    我的IDEA版本是2022版 最近学习微服务发现打不开RunDashBoard 可能是更改了名称叫做Services 点击下方的Services 再点击加号 选择Run Configuration Type 之后选择springboot 就
  • vulnhub靶机Me-and-My-Girlfriend-1打靶记录

    准备环境 kali linux ip 172 16 10 149 Me and My Girlfriend 1 虚拟机n 渗透工具 kali虚拟机 nmap 端口扫描工具 pker后台扫描工具 谷歌xff伪造插件 X Forwarded F
  • 基于SpringBoot+微信小程序的失物招领小程序

    基于SpringBoot 微信小程序的失物招领小程序 全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战
  • uiautomator2实例

    from pytestreport import TestRunner import uiautomator2 as u2 import email import os import smtplib import random import
  • 以太坊燃烧第一个24小时,中文社区在关心什么?

    8月5日 在区块高度 12965000 北京时间8月5日20 33 备受瞩目的以太坊伦敦升级完成 伦敦升级涉及众多提案 其中最令人关注的是EIP 1559 该提案引入销毁机制 让链上费用更合理 同时也一定程度缓解了以太坊的通胀 截至8月6日
  • JDK Self-Extracting Installation for Linux (64-bit)

    http www oracle com technetwork java javase install linux 64 self extracting 142068 html JDK Documentation System Requir
  • nodejs剪切视频,提取音频,上传播放

    简单说说实现方案 首先要有演唱会的链接 使用ibili 这个库下载视频 也可以自己抓取视频链接请求下载 这里有很多方法 将视频保存在本地后 整理出每一首歌曲对应的时分秒 我找的这个视频在某站评论中已经有人整理过了 所以我用 ibili 这个
  • netty在xxl-job中的使用分析

    xxl job版本 2 3 0 netty版本 netty all 4 1 63 final 一 基于spring容器 客户端启动流程 客户端如springboot应用引入xxl core的jar包后 启动springboot过程中会调用x
  • Mysql8.0 安装手册(linux)

    目录 添加Mysql的 yum 仓库 安装mysql 开启远程访问 添加Mysql的 yum 仓库 访问 https dev mysql com downloads repo yum 下载 yum 源 点击 download 复制下载链接使
  • 00.JavaScript基础

    0o 参考资料 js https codeofli github io 2019 11 js note javaScript javaScript vue https codeofli github io 2019 11 js note v
  • @ConfigurationProperties灵活的映射配置信息

    介绍 在用 ConfigurationProperties最常用的功能是用此注解对类进行修饰 设置好prefix前缀 这样在springboot的配置文件中 配置信息的key和value就会对应的配置到类中的属性上 以设置eureka信息为
  • nas挂载windows_【群晖系统】群晖下直接挂载WINDOWS的NTFS格式硬盘

    群晖的硬盘格式是EXT4 相对于WINDOWS下的NTFS格式 大家较不熟悉 在数据管理 使用 恢复等都不如NTFS方便 如果群晖能支持NTFS格式就好了 相信每一位装黑群晖的朋友当时都会有这样的想法 其实 群晖是支持外部设备的NTFS格式
  • c++实现引用计数

    概述 当有指针指向同一块内存空间时 计数器加1 没增加一个指向该内存空间的指针 计数器加1 同理 当原本指向该内存空间的指针指向另一块内存 计数器减1 被指向的另一个内存的计数器加1 下面是一个引用计数的一种实现 示例 直接上代码 总共分为