上篇文章介紹了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時才允許釋放計數器。