智能指针原理剖析(二):shared_ptr、weak_ptr

智能指针原理剖析(一):auto_ptr、unique_ptr

shared_ptr、weak_ptr原理剖析

关于shared_ptr源码剖析的博客有很多,推荐一篇讲解十分详细的博客:从源码理解智能指针(二)—— shared_ptr、weak_ptr。本文在此基础上,对shared_ptr、weak_ptr实现的原理进行总结并画出类关系图,读者可结合两篇博客一起阅读,从而帮助理解。

总体而言,实现shared_ptr、weak_ptr智能指针是通过两个基类_Ref_count_base、_Ptr_base以及它们的派生类来实现的,其结构图如下:
在这里插入图片描述

1、抽象类_Ref_count_base

class _Ref_count_base
	{
   	// common code for reference counting
private:
	virtual void _Destroy() = 0;
	virtual void _Delete_this() = 0;

private:
	_Atomic_counter_t _Uses;  //强引用计数
	_Atomic_counter_t _Weaks;  //弱引用计数

protected:
	_Ref_count_base()
		{
   	// construct
		_Init_atomic_counter(_Uses, 1);  //强引用计数初始化为1
		_Init_atomic_counter(_Weaks, 1); //弱引用计数初始化为1
		}

public:
	virtual ~_Ref_count_base() _NOEXCEPT  //虚析构函数
		{
   	// ensure that derived classes can be destroyed properly
		}

	unsigned int _Get_uses() const  //获取强引用计数
		{
   	// return use count
		return (_Get_atomic_count(_Uses));
		}
		
	void _Incref()
		{
   	// increment use count
		_MT_INCR(_Mtx, _Uses);// _Uses+1
		}
 
	void _Incwref()
		{
   	// increment weak reference count
		_MT_INCR(_Mtx, _Weaks);//_Weaks+1
		}
		
	void _Decref()
		{
   	// decrement use count
		if (_MT_DECR(_Mtx, _Uses) == 0)
			{
   	// destroy managed resource, decrement weak reference count
			_Destroy(); //释放资源
			_Decwref();
			}
		}

	void _Decwref()
		{
   	// decrement weak reference count
		if (_MT_DECR(_Mtx, _Weaks) == 0)  //判断弱引用计数-1后是否为0
			_Delete_this(); //删除计数器自身
		}

	long _Use_count() const  //返回强引用计数
		{
   	// return use count
		return (_Get_uses());
		}

	bool _Expired() const    //强引用计数是否为0
		{
   	// return true if _Uses == 0
		return (_Get_uses() == 0);
		}

	
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值