当前位置: 首页 > web >正文

C++手撕 shared_ptr

        智能指针的前置知识可以参考 智能指针点这里 话不多说,上代码

#include<iostream>
using namespace std;class Count//引用计数
{
public:Count(){	num = 1;}void add(){	num++;  }//引用计数增加void sub(){	num--;	}//引用计数减少int get(){	return num;	}//获取当前引用计数
private:int num = 0;
};template<typename T>
class smartPtr
{
public:smartPtr(T* ptr = nullptr)//构造函数:p(ptr){if (p) cnt = new Count();//如果p不为空,则创建引用计数类的指针else cnt = nullptr;}~smartPtr()//析构函数{if (cnt){cnt->sub();//引用计数 -1if (cnt->get() == 0)//如果引用计数减为0,释放资源{delete p;p = nullptr;delete cnt;cnt = nullptr;}}}smartPtr(const smartPtr& ptr)//左值拷贝构造{this->p = ptr.p;this->cnt = ptr.cnt;if (p) {cnt->add();}}smartPtr(smartPtr&& ptr)//右值拷贝构造{this->p = ptr.p;this->cnt = ptr.cnt;//将原资源的指针置空ptr.p = nullptr;ptr.cnt = nullptr;}smartPtr<T>& operator=(const smartPtr& ptr)//左值赋值运算符重载{//把原先的资源做处理if (this->p) {cnt->sub();if (cnt->get() == 0){delete p;}}//指向新资源this->p = ptr.p;this->cnt = ptr.cnt;this->cnt->add();return *this;}smartPtr<T>& operator=(const smartPtr&& ptr)//右值赋值运算符重载{//处理旧资源if (this->p){cnt->sub();if (cnt->get() == 0){delete p;}}//指向新资源this->p = ptr.p;this->cnt = ptr.cnt;//处理右值指针ptr.p = nullptr;ptr.cnt = nullptr;return *this;}T* get()//获取原始指针{return p;}T* operator->()//箭头{return p;}T& operator*()//解引用{return *p;}int getCount()//获取引用计数{if (!cnt) return 0;return cnt->get();}private:T* p;Count* cnt;
};int main()
{int* p = new int(123);smartPtr<int> ptr1(p);cout << ptr1.getCount() << endl;{smartPtr<int> ptr2(ptr1);cout << ptr2.getCount() << endl;}cout << ptr1.getCount() << endl;smartPtr<int> ptr3;cout << ptr3.getCount() << endl;ptr3 = ptr1;cout << ptr3.getCount() << endl;return 0;
}

        赋值运算符重载的返回值是 smartPtr<T>& 原因是,这样可以方便连续赋值 类似 a = b = c 的方式。

        代码不是很完善,有什么问题,欢迎大家批评指正。

http://www.xdnf.cn/news/10349.html

相关文章:

  • Paimon 建表常用属性分析
  • simulink mask的使用技巧
  • Windows下编译zlib
  • LangGraph 快速入门
  • Ubuntu设置之初始化
  • 利用Dify创建一个公司产品知识问答
  • DeepSeek部署实战:常见问题与高效解决方案全解析
  • 【Java基础05】面向对象01
  • leetcode动态规划—买卖股票系列
  • Python案例解析 : 函数模块化编程的实践应用
  • CTFHub-RCE 命令注入-过滤目录分隔符
  • 解决8080端口被占问题
  • python学习day34
  • 学习海康VisionMaster之表面缺陷滤波
  • Cesium快速入门到精通系列教程
  • 【KWDB 创作者计划】_探秘浪潮KWDB数据库:从时间索引到前沿技术
  • 用户认证的魔法配方:从模型设计到密码安全的奇幻之旅
  • ApiHug 1.3.9 支持 Spring 3.5.0 + Plugin 0.7.4 内置小插件升级!儿童节快乐!!!
  • vue-08(使用slot进行灵活的组件渲染)
  • Java Spring 之监听器(Listener)详解与实战
  • 如何查看电脑电池性能
  • 对蚁群算法的理解和实例详解
  • [笔记]一般小信号测量方法
  • 企业微信接入说明
  • proteus美观与偏好设置
  • Qq空间照片视频批量下载工具
  • TomSolver 库 | 入门及使用
  • docker安装和镜像源替换
  • Python训练营---Day41
  • GoogLeNet网络模型