C++自定义智能指针

template <class T>
class counted_ptr;// 智能指针引用计数类
template <class T>
class Ref_Ptr
{friend class counted_ptr<T>;
private:T* m_pTtr; // 实际的指针size_t counted_ptr; // 引用计数Ref_Ptr(T* p);virtual ~Ref_Ptr();
};template <class T>
Ref_Ptr<T>::Ref_Ptr(T* p)
{m_pTtr = p;counted_ptr = 1;cout<<"Ref_Ptr() 构造函数调用!"<<endl;
}template <class T>
Ref_Ptr<T>::~Ref_Ptr()
{if (m_pTtr){cout<<"~Ref_Ptr() 析构函数函数调用"<<endl;delete m_pTtr;counted_ptr = 0;}m_pTtr = NULL;
}// 智能指针对象
template <class T>
class counted_ptr
{
private:Ref_Ptr<T>* m_pRef; // 引用计数
public:counted_ptr();counted_ptr(T* p);~counted_ptr();// 重载运算=,将左对象引用计数-1,并判断是否delete;将右对象+1;counted_ptr<T> & operator = (counted_ptr& other);// 重载指针操作*,->T& operator *();T* operator ->();// 拷贝构造函数,引用计数+1counted_ptr(counted_ptr<T>& other);
};
template <class T>
counted_ptr<T>::counted_ptr()
{m_pRef = NULL;
}template<class T>
counted_ptr<T>::counted_ptr(T* p)
{m_pRef = new Ref_Ptr<T>(p);cout<<"counted_ptr(T* p) 构造函数调用"<<endl;
}template <class T>
counted_ptr<T>::counted_ptr(counted_ptr<T>& other)
{this->m_pRef = other.m_pRef;++(m_pRef->counted_ptr);cout<<"counted_ptr(& other) 拷贝构造函数被调用,当前引用计数"<< this->m_pRef->counted_ptr<<endl;
}template <class T>
counted_ptr<T>& counted_ptr<T>::operator=(counted_ptr& other)
{// 将右操作对象引用计数+1++(other.m_pRef->counted_ptr);// 由于左操作对象指向了新对象,需要将操作数-1;// 同时也防止了自赋值的方式.// 首先要判断这个对象是否已经指向了其他对象,这个很重要!防止左指针对象为null的情况.if (this->m_pRef){if (--(this->m_pRef->counted_ptr) == 0){delete this->m_pRef;}}this->m_pRef = other.m_pRef;cout<<"operator = 被调用,当前引用计数"<< this->m_pRef->counted_ptr<<endl;return *this;
}template <class T>
T& counted_ptr<T>::operator *()
{return *(m_pRef->m_pTtr);
}template <class T>
T* counted_ptr<T>::operator->()
{return (m_pRef->m_pTtr);
}template <class T>
counted_ptr<T>::~counted_ptr()
{cout<<"~counted_ptr() 析构函数被调用"<<endl;if ((--m_pRef->counted_ptr) == 0){cout<<"删除"<<endl;delete m_pRef;m_pRef = NULL;}if (m_pRef){cout<<"当前引用计数:"<< m_pRef->counted_ptr<<endl;}
}int  main()
{counted_ptr<int>* pPtr = NULL;{counted_ptr<int> g_ptr;{// 声明一个ptr1智能指针,并测试*运算符counted_ptr<int> ptr1(new int(4));counted_ptr<int> ptr2;cout<< "*ptr1="<< *ptr1<<endl;// 将生存期小的ptr1赋值给生存期更大的g_ptr;ptr2 = ptr1;system("pause");g_ptr = ptr1;system("pause");}// new int(4)并没有销毁,因为引用计数还有1个cout<<" *g_ptr="<<*g_ptr << endl;system("pause");}system("pause");getchar();return 0;
}

参考 

std::shared_ptr - cppreference.com


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用tar命令解压文件的教程

使用tar命令解压文件的教程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Linux和Unix系统中&#xff0c;tar命令是一个常用的压缩和解压工具&#xff0c;…

【Arduino】实验使用ESP32控制可编程继电器制作跑马灯(图文)

今天小飞鱼实验使用ESP控制继电器&#xff0c;为了更好的掌握继电器的使用方法这里实验做了一个跑马灯的效果。 这里用到的可编程继电器&#xff0c;起始原理并不复杂&#xff0c;同样需要ESP32控制针脚输出高电平或低电平给到继电器&#xff0c;继电器使用这个信号控制一个电…

如何焊铜管 量测射频前端模块

先说结论 要做Port Extension待测物要上电 且根据逻辑表给Enable pin上电网分输入功率 不要太大 -20dBm即可铜管的接地 要足够 以及足够近铜管与待测物之间 必要时 隔一颗电容不要将匹配元件 也包含在量测范围讯号针不要直接焊在焊盘上 首先 铜管要做Port…

深度分析 Apache Flink 窗口机制

什么是 Flink 窗口&#xff1f; Apache Flink 是一个用于处理实时流数据的开源框架&#xff0c;其核心功能之一是窗口&#xff08;Window&#xff09;机制。窗口是 Flink 在处理流数据时用于划分数据流的逻辑概念&#xff0c;它将无限的流数据切割成有限的、可管理的部分&…

二分查找:C++ 库函数 upper_bound、lower_bound 和 binary_search

二分查找是一种在有序数组中查找特定元素的高效算法。在二分查找中&#xff0c;upper_bound、lower_bound 和 binary_search 是三个常用的操作&#xff0c;C标准库也提供了原生 API&#xff0c;它们都利用了二分查找&#xff0c;但用于解决略微不同的问题。 介绍 binary_sear…

LCT——Link Cut Tree及其应用

我们知道&#xff0c;想要维护树上的一段区间&#xff0c;我们可以采用重链剖分来将其划分 但是&#xff0c;树链剖分只能够维护静态&#xff08;树的形态不发生变化&#xff09;的树&#xff0c;倘若我们需要动态对树的形态进行修改&#xff0c;比如将某个结点换为树的根、树…

50-3 内网信息收集 - 域环境搭建

搭建准备: 在搭建准备阶段,我们需要准备三台 Windows 虚拟机:Windows Server 2012、Windows 7 和 Windows Server 2008。接下来,我们将配置 Windows Server 2012 作为域控制器,而 Windows 7 和 Windows Server 2008 将作为成员机加入域。建议保持这三台虚拟机的内存不超过…

51单片机第15步_串口多机通讯使用CRC8校验

本章重点介绍串口多机通讯使用CRC8校验。 数据格式:"$123xxxx*crc8\r\n"; 如:"$1234567890ABCDEF*06\r\n" 如:"$1231234567890*31\r\n" crc8是CRC校验值,为十六进制的ASCII码,不包含$和校验值前面的那个* #include <REG51.h> //包含…

王佩丰 Excel 基础二十四讲——目录

前言 跟着B站学习王佩丰 Excel 基础教程&#xff0c;本文章为索引目录 课程传送门&#xff1a;视频地址——点击前往 王佩丰Excel基础教程24讲完整版 第一讲&#xff1a;认识 Excel 第二讲&#xff1a;Excel 单元格格式设置&#xff08;未编辑&#xff09; 第三讲&#xff1a;…

Zoom屏幕共享:远程协作的桥梁

标题&#xff1a;Zoom屏幕共享&#xff1a;远程协作的桥梁 摘要 Zoom的屏幕共享功能是其最受欢迎的特性之一&#xff0c;它允许用户在视频会议中共享他们的屏幕内容&#xff0c;从而实现高效的远程协作和演示。本文将详细解释Zoom屏幕共享功能的工作原理&#xff0c;并提供使…

JavaScript 动态网页实例 —— 视频动画

要在网页中播放各种视频和音频文件,需要为页面添加插件和控件。ActiveX是Microsof公司的对象组件技术,允许Windows程序在运行时刻载入并使用其他程序。ActiveX控件常用作浏览器的子程序,以增强页面的交互作用。另外,尽管没有官方的HTML描述,但通常都使用<embed></…

unity中off mesh link组件无法正常使用

unity中off mesh link组件无法正常使用 问题解决 问题 如果使用了新版导航方式&#xff0c;发现只有当agent设置为humanoid才可以正常实现off mesh link的跳转效果&#xff0c;设置为其他agent type就无法正常跳转&#xff0c;且bake之后会发现off mesh link周围是没有圆圈的。…

Spring基础知识 - IOC、DI、AOP

1、什么是 Spring 框架&#xff0c;它的优点是什么&#xff1f;它的主要功能是什么&#xff1f; Spring 框架是一个开源的 Java 框架&#xff0c;主要用于开发企业级 Java 应用程序。它提供了一组强大的功能和工具&#xff0c;使得开发者能够更加容易地构建高效、可维护和可扩展…

(漏洞检查项) | 任意文件包含漏洞 file-include

(漏洞检查项)|任意文件包含漏洞 file-include 漏洞场景 1.含有动态包含语句 2.有类似于文件读取的url 漏洞描述 攻击者可以利用任意文件包含漏洞&#xff0c;读取任意文件&#xff0c;对服务器造成危害。 程序开发人员为了代码的灵活性&#xff0c;常常会将包含文件的路径…

influxdb时序数据库使用

influxdb时序数据库使用 1.1.免费无云influx申请1.2.Telegraf安装1.3.influxdb安装mac安装Redhat && Centos安装docker安装Kubernetes安装windows安装 1.4.influx CLI 安装1.5.influx命令行界面1.5.influx配置项权限认证配置管理 API 令牌 InfluxDB 是一个开源分布式时…

用通俗易懂方式讲解:快速部署大模型 ChatGLM3 并进行推理

在深入了解了一些大模型的知识之后&#xff0c;最好的方法是亲自动手搭建一个开源的大模型&#xff0c;以更深入地理解其工作原理。 在此基础上&#xff0c;我们将以 ChatGLM3 为例进行部署及推理&#xff0c;从而进一步探索大模型的应用和实践。 ChatGLM3简介&#xff1a; …

Alibaba Cloud Linux详解_操作系统兼容性_alinux稳定性全解析

Alibaba Cloud Linux是阿里云自研的稳定、安全、高性能的服务器Linux操作系统&#xff0c;完全兼容CentOS/RHEL生态和操作方式&#xff0c;又阿里云提供免费提供长期支持和维护LTS。Alibaba Cloud Linux是目前阿里云服务器最大规模使用的操作系统之一&#xff0c;可部署在Web网…

无刷直流电机(BLDCM)位置识别SVPWM控制

无刷直流电机&#xff0c;即BLDCM&#xff0c;在各个行业应用非常广泛。我们最熟悉的是在四轴飞行器中的应用&#xff0c;其中的电机基本都是BLDCM。除此之外&#xff0c;汽车电子、家用电器、航空航天、办公自动化、机器人等领域都有重要应用。 梯形波/方波无刷直流电机被称为…

基于单片机技术的按键扫描电路分析

摘 要&#xff1a; 单片机应用技术被广泛应用于各种智能控制系统中&#xff0c;是电子信息类专业学生必修的一门专业课。在单片机端口信息输入模块中&#xff0c;按键是主要元器件之一&#xff0c;笔者主要介绍矩阵键盘的电路设计及控制程序编写&#xff0c;分析了单片机端口连…

asyncawait

参考&#xff1a; 并发&#xff1a;并发基本概念 python 使用 async 和 await 语法的东西来写”异步代码“。 import asyncio import httpxasync def fetch_baidu():url "https://www.baidu.com"async with httpx.AsyncClient() as client:try:response await c…