智能指针原理剖析(一):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);
}