上篇文章介绍了shared_ptr对象构造,这篇文章记录其析构过程。
~shared_ptr() _NOEXCEPT
{ // release resource
this->_Decref(); //【1】
}
//[1]
void _Decref()
{ // decrement reference count
if (_Rep != 0)
_Rep->_Decref();//[2]
}
//[2]如果_Uses-1为0,先释放资源([3]), 再看weak如果weak-1为0,删除计数器。否则将不做操作。
void _Decref()
{ // decrement use count
if (_MT_DECR(_Uses) == 0)
{ // destroy managed resource, decrement weak reference count
_Destroy();//[3]
_Decwref();//[4]
}
}
//[3]类_Ref_count成员,释放资源。
virtual void _Destroy() _NOEXCEPT
{
// destroy managed resource
delete _Ptr;
}
//[4]_Ref_count_base成员,如果weak-1为0,删除计数器
void _Decwref()
{
// decrement weak reference count
if (_MT_DECR(_Weaks) == 0)
_Delete_this();//[5]
}
//销毁计数器内存
virtual void _Delete_this() _NOEXCEPT
{
// destroy self
delete this;
}
shared_ptr析构更关注uses数量,只有不存在weak_ptr时才允许释放计数器。