shared_ptr的理解

shared_ptr使用误区

//shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
//https://www.cnblogs.com/acmLLF/p/14730783.html
//https://blog.csdn.net/weixin_44826356/article/details/105912215
//异常安全 https://www.jianshu.com/p/03eea8262c11
数据结构

//正确用法
	Shared_ptr<int> pInt2(new int(1)); //此时count是1
	Shared_ptr<int> pInt3(pInt2);///* 用一个shared_ptr对象来初始化另一个shared_ptr实例 */   //此时count是2
	Shared_ptr<int> pInt4 = pInt2;  //此时count是3
//错误用法
	int *pInt1 = new int(11);  //避免使用裸指针类型的变量来创建std::shared_ptr指针
	Shared_ptr<int> pInt2(pInt1 );  //此时count是1						
	Shared_ptr<int> pInt4 = pInt1 ; //此时count是1

总结 : 还是得用make_shared,不能用裸指针(控制块的T和count不在连续的内存了),也不能用shared_ptr(new T)(会造成异常安全)。

异常安全

手写简易shared_ptr

template<typename T>
class Shared_ptr
{
private:
	int *count;
	T *ptr;
	mutex *m;

	void addCount()
	{//计数器
		m->lock();
		(*count)++;
		m->unlock();
	}

	void release()
	{
		bool flag = false;  //deleteflag
		m->lock();
		(*count)--;
		if (*count == 0)
		{//说明计数器清零了
			delete count;
			delete ptr;
			flag = true;
		}
		m->unlock();

		if (flag == true)
		{
			delete m; //把锁也删除了
		}
	}
public:

	Shared_ptr(T* tptr):ptr(tptr),count(new int(1)),m(new mutex){}  //构造函数
	~Shared_ptr(){
		//析构函数
		release();
	}  
	Shared_ptr(const Shared_ptr<T> & sp):ptr(sp.ptr), count(sp.count), m(sp.m)
	{
		addCount();
	}

	Shared_ptr<T> * operator=(const Shared_ptr<T> & sp)
	{
		if (ptr != sp.ptr)
		{//if (this != &sp)
			ptr = sp.ptr;
			count = sp.count;
			m = sp.m;

			addCount(); //计数器+1
		}
		return *this;
	}

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

	int usecount()
	{
		return *count;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值