首页 > 编程语言 >C++ shared_ptr的实现

C++ shared_ptr的实现

时间:2022-12-09 17:00:45浏览次数:34  
标签:count rhs C++ Shared shared haveDeleterOrNot ptr ptrToObject

比较完整的复现了STL中的shared_ptr中的功能,可以加载删除器,并且加入了互斥,可以在多线程中使用。

#include <iostream>
#include <mutex>
using namespace std;

template <typename T>
class Shared_ptr {
public:
	Shared_ptr(T * t_ptrToObject) {
		m = new mutex();
		this->haveDeleterOrNot = t_ptrToObject;
		this->count = malloc(sizeof(int));
		(*this->count) = 1;
		this->haveDeleterOrNot = false;
	}
	
	Shared_ptr(T * t_ptrToObject, void (*t_deleter)(T *)) {
		this->m = new mutex();
		this->ptrToObject = t_ptrToObject;
		
		this->count = (int *)malloc(sizeof(int));
		(*this->count) = 1;
		
		this->deleter = t_deleter;
		this->haveDeleterOrNot = true;
	}
	
	Shared_ptr(const Shared_ptr & rhs) {
		this->m = rhs.m;
		(*m).lock();
		this->ptrToObject = rhs.ptrToObject;
		this->count = rhs.count;
		
		(*(rhs.count)) = (*(rhs.count)) + 1;
		
		this->haveDeleterOrNot = rhs.haveDeleterOrNot;
		this->deleter = rhs.deleter; 
		
		(*m).unlock();
	}
	
	
	Shared_ptr & operator= (const Shared_ptr & rhs) {
		this->m = rhs.m;
		(*m).lock();
		this->ptrToObject = rhs.ptrToObject;
		this->count = rhs.count;
		
		(*(rhs.count)) = (*(rhs.count)) + 1;
		
		this->haveDeleterOrNot = rhs.haveDeleterOrNot;
		this->deleter = rhs.deleter; 
		
		(*m).unlock();
		
		return (*this);
	}
	
	
	//rewrite the operator 
	T & operator* () {
		return *(this->ptrToObject);
	}
	
	T * operator-> () {
		return this->ptrToObject;
	}
	
	
	~Shared_ptr() {
		(*m).lock();
		(*count) = (*count) - 1;
		
		if ((*count) == 0 && this->haveDeleterOrNot) {
			(*(this->deleter))(this->ptrToObject);	
		}
		else if ((*count) == 0 && !this->haveDeleterOrNot) {
			delete this->ptrToObject;
		}
		
		(*m).unlock();
	}
	
	int getCount() const{
		return *this->count;
	}
	
private:
	T * ptrToObject;
	int * count;
	bool haveDeleterOrNot; 
	void (*deleter)(T *);	
	mutex * m;
};

void test(int * num) {
	cout << "num: " << *num << endl;
}


int main() {
	int * num = new int(5); 
	Shared_ptr<int> sp1(num, test);
	Shared_ptr<int> sp2(sp1);
	Shared_ptr<int> sp3 = sp1;
	
	cout << sp1.getCount()  << endl;
//	void (*deleter)(int *);
//	deleter = test;
//	void (*t_deleter)(int *);
//	t_deleter = deleter;
//	(*t_deleter)(num);
	return 0;
}

  

标签:count,rhs,C++,Shared,shared,haveDeleterOrNot,ptr,ptrToObject
From: https://www.cnblogs.com/woodx/p/16969404.html

相关文章

  • C++新增数据类型long long ,unsigned long long
    相比于C++98标准,C++11整型的最大改变就是多了longlong。但事实上,longlong整型本来就离C++标准很近,早在1995年,longlong就被提议写入C++98标准,却被C+......
  • 第二章:10道C/C++经典面试题
    面试题11:设置地址为0x67a9的整型变量的值为0xaa66int*ptr;ptr=(int*)0x67a9;*ptr=0xaa66;说明:这道题就是强制类型转换的典型例子,无论在什么平台地址长度和整型数据......
  • C++猜数字游戏的程序,用srand()函数产生随机数
    /*编写一个猜数字游戏的程序:程序随机选择一个1到1000的数,然后输出:  Ihaveanumberbetween1and1000.    Canyouguessmynumber?  Pleasetype......
  • C语言中的结构体与C++中的类异同
    从C语言到C++,是编程思想的进步,技术发展的结果吧,所以C++基本上是兼容C的语法的,C++的很多东西也是从C中继承过来的,然后再发扬,C语言的结构体便是C++中类的雏形。       ......
  • MFC,VC++中,CView类意外消失
    (1)在我们写MFC程序的时候,可能CView类可能会意外的消失,现在我用的是Win7操作系统,VC6.0和WindowsXP是完全兼容的,可能是系统兼容的问题,所以在Win7系统下编写程序总会出现一些莫......
  • MFC,VC++计算器小程序
    大学期末没课,某个中午闲来无聊,正好在自学MFC,于是想用MFC、C++写点东西,由于能力有限,当然的写个简单点的啦,于是花了两个小时写了这个计算器的小程序,希望对初学VC++和MFC的朋友有所帮助。程......
  • 冒泡排序算法详解C++程序
    (1)冒泡排序算法:(BubbleSort)首先肯定是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到......
  • 《安富莱嵌入式周报》第294期:将C/C++代码转换为各种高级语言,超炫渲染着色器,VS2022新闻
    往期周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104更新视频教程:USB应用实战视频教程第5期:手把手玩转USBHID免驱方式......
  • C++那些事-static
    static那些事关于作者微信公众号:当与不同类型一起使用时,Static关键字具有不同的含义。我们可以使用static关键字:静态变量:函数中的变量,类中的变量静态类的成员:类对......
  • C++那些事-const
    关于作者微信公众号:1.const含义常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。2.const作用可以定义常量constinta=100;......