天天看點

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時才允許釋放計數器。

繼續閱讀