shared_ptr源码分析

shared_ptr是从C++11开始提供的智能指针,用于管理多个指针对同一实体的资源释放问题,保证在多个指针指向同一实体时,仅最后一个指针解除指向时才会释放资源。

shared_ptr构造

shared_ptr<_Tp>继承自__shared_ptr<_Tp>,其功能主要由其实现。让我们以单值构造函数为切入点开始分析。

      template<typename _Yp, typename = _Constructible<_Yp*>>
	explicit
	shared_ptr(_Yp* __p) : __shared_ptr<_Tp>(__p) {
    }

从中我们可以看到,调用了基类的构造函数,定义如下

      template<typename _Yp, typename = _SafeConv<_Yp>>
	explicit
	__shared_ptr(_Yp* __p)
	: _M_ptr(__p), _M_refcount(__p, typename is_array<_Tp>::type())
	{
   
	  static_assert( !is_void<_Yp>::value, "incomplete type" );
	  static_assert( sizeof(_Yp) > 0, "incomplete type" );
	  _M_enable_shared_from_this_with(__p);
	}

其初始化了成员变量_M_ptr_M_refcount,这两个成员变量的定义如下。element_type就是构造时传入的指针指向类型,这里我们可以看到,share_ptr的实现就是最基本的指针加上引用计数。

element_type*	   _M_ptr;         // Contained pointer.
__shared_count<_Lp>  _M_refcount;    // Reference counter.

让我们接下看看_M_refcount的构造过程,其调用如下构造函数,我们能够看到他初始化了数据成员_M_pi

      template<typename _Ptr>
        explicit
	__shared_count(_Ptr __p) : _M_pi(0)
	{
   
	  __try
	    {
   
	      _M_pi = new _Sp_counted_ptr<_Ptr, _Lp>(__p);
	    }
	  __catch(...)
	    {
   
	      delete __p;
	      __throw_exception_again;
	    }
	}

数据成员_M_pi的定义如下,他是一个基类的指针,可以指向任何派生类,所以_M_pi = new _Sp_counted_ptr<_Ptr, _Lp>(__p)并不存在任何语法问题。

_Sp_counted_base<_Lp>*  _M_pi;

让我们接着查看代码,首先是_Sp_counted_ptr<_Ptr, _Lp>(__p)的构造,其初始化了数据成员_Ptr _M_ptr,这里我们可以发现_Sp_counted_ptr存在一个指针指向其引用的对象。

explicit
_Sp_counted_ptr(_Ptr __p) noexcept
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值