首页 > 其他分享 >智能指针之手撕共享指针shared_ptr

智能指针之手撕共享指针shared_ptr

时间:2024-09-22 22:47:42浏览次数:1  
标签:count return SharePtr sp shared ptr 指针

要点

  • 成员是指向实例的指针和应用计数
  • 应用计数也应该是一个共享的int指针,因为这个计数需要各个共享指针同步维护
  • 需要重载的函数有:用指针构造;拷贝构造;赋值运算符=;解地址运算符*;指针调用成员的运算符->;析构函数;
  • 涉及到计数的部分:
    • 构造时初始化:1
    • 拷贝构造:+1
    • 赋值=:原有-1,新对象+1。注意-到0时,要执行析构;
    • 析构函数:-1。注意-到0时,要执行析构;

贴个代码

  #include <iostream>
  using namespace std;

  template <typename T>
  class SharePtr {
  private:
  	T* _ptr;
  	int* _count;
  public:
  	SharePtr(T* p) : _ptr(p), _count(new int(1)){}

  	SharePtr(const SharePtr<T>& sp) {
  		_ptr = sp._ptr;
  		_count = sp._count;
  		++(*_count);
  		return;
  	}

  	SharePtr<T>& operator=(const SharePtr<T>& sp) {
  		if ((--*(this->_count)) == 0) {
  			delete this->_count;
  			delete this->_ptr;
  		}
  		this->_ptr = sp->_ptr;
  		this->_count = sp->_count;
  		++(*(this->count));
  		return;
  	}

  	T& operator*() {
  		return *(this->_ptr);
  	}

  	T& operator->() {
  		return this->_ptr;
  	}

  	~SharePtr() {
  		if ((--*(this->_count)) == 0) {
  			delete this->_count;
  			this->_count = nullptr;
  			delete this->_ptr;
  			this->_ptr = nullptr;
  		}
  		return;
  	}

  	void show();
  };

  template<typename T>
  void SharePtr<T>::show() {
  	cout << this->_ptr << " " << this->_count << endl;
  	cout << *(this->_ptr) << " " << *(this->_count) << endl;
  	cout << endl;
  }

  int main()
  {
  	SharePtr<int> sp1(new int(1));
  	sp1.show();
  	SharePtr<int> sp2(sp1);
  	sp1.show();
  	SharePtr<int> sp3 = sp2;
  	sp2.show();
  	return 0;
  }

标签:count,return,SharePtr,sp,shared,ptr,指针
From: https://www.cnblogs.com/GaogaoBlog/p/18426040

相关文章

  • C语言深入理解指针(四)
    目录字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字函数指针数组转移表字符指针变量字符指针在之前我们有提到过,(字符)(指针)前面的字符代表着存储的元素为......
  • 双指针算法专题(2)
    找往期文章包括但不限于本期文章中不懂的知识点:个人主页:我要学编程(ಥ_ಥ)-CSDN博客所属专栏: 优选算法专题想要了解双指针算法的介绍,可以去看下面的博客:双指针算法的介绍 目录611.有效三角形的个数LCR179.查找总价格为目标值的两个商品15.三数之和18.四数之和......
  • 理解C语言之深入理解指针(一)上
    目录1.内存和地址1.1内存1.2究竟该如何理解编址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和解引⽤操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引⽤操作符2.3指针变量的⼤⼩3.指针变量类型的意义3.1指针的解引⽤3.2指针+-整数3.3void*......
  • 理解C语言之深入理解指针(一)下
    目录5.指针运算5.1指针+-整数5.2指针-指针5.3指针的关系运算6.野指针6.1野指针成因6.2如何规避野指针6.2.1指针初始化6.2.2⼩⼼指针越界6.2.3指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性6.2.4避免返回局部变量的地址7.assert断⾔8.指针......
  • C语言指针详解与应用
    C语言指针1.指针简介指针与底层硬件紧密联系,使用指针可操作数据地址,实现数据的间接访问2.计算机存储机制在C语言中内存的分配是以一个字节为单位进行线性分配且每个字节都会对应的地址inta=0x12345678;shortb=0x5A6B;charc[]={0x33,0x34,0x35};**int......
  • C语言指针进阶笔试题(含解析)
    笔试题1:intmain(){ inta[5]={1,2,3,4,5}; int*ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return0;} 解析:*(a+1),a是首元素的地址,加1之后就是第二个元素的地址,解引用就是2。ptr是&a+1,取出的是整个数组的地址,加1跳过整个数组:强转为int......
  • c语言学习---指针
    1.计算机内存划分为一个个内存单元,每个内存单元占1字节,而每个内存单元都有一个特点的编号,称为地址,也称为指针,通过指针可以找到对应的内存单元并调用内存单元内存放的数据.2.指针变量:存放指针的变量称为指针变量,表示形式如下:指向数据类型*变量名,通过*(解引用操作符)操作指针变......
  • C和指针:指针
    内存和地址程序视角看内存是一个大的字节数组,每个字节包含8个位,可以存储无符号值0至255,或有符号值-128至127。多个字节可以合成一个字,许多机器以字为单位存储整数,每个字一般由2个或4个字节组成。由于它们包含了更多的位,每个字可以容纳的无符号整数的范围是从0至4294967295(2^32-1)......
  • 【C总集篇】第八章 数组和指针
    文章目录第八章数组和指针数组数组回顾初始化数组初始化数组介绍初始化失败案例部分初始化自动匹配数组给数组赋值数组边界指定数组大小多维数组二维数组的定义二维数组的初始化指针与数组函数数组与指针函数数组与指针初了解使用指针形参指针操作八种基本指针......
  • C和指针:结构体(struct)和联合(union)
    结构体和联合结构体结构体包含一些数据成员,每个成员可能具有不同的类型。数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。结构声明在声明结构时,必须列出它包含的所有成员。struct......