std::shared_ptr析构过程剖析

上篇文章介绍了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时才允许释放计数器。

猜你喜欢

转载自blog.csdn.net/ypy9323/article/details/81156008
今日推荐