std shared ptr析構過程剖析

2021-08-21 16:06:37 字數 460 閱讀 5419

上篇文章介紹了shared_ptr物件構造,這篇文章記錄其析構過程。    

~shared_ptr() _noexcept

//[1]

void _decref()

//[2]如果_uses-1為0,先釋放資源([3]), 再看weak如果weak-1為0,刪除計數器。否則將不做操作。

void _decref()

}//[3]類_ref_count成員,釋放資源。

virtual void _destroy() _noexcept

//[4]_ref_count_base成員,如果weak-1為0,刪除計數器

void _decwref()

//銷毀計數器記憶體

virtual void _delete_this() _noexcept

shared_ptr析構更關注uses數量,只有不存在weak_ptr時才允許釋放計數器。

虛析構 純虛析構

析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。從高到低依次析構 因為在c 中,當乙個派生類物件通過使用乙個基類指標進行刪除 b a a a new b delete a 而這個基類有乙個非虛的析構函式,則結果是未定義的...

C 析構函式 虛析構函式

1.為什麼要定義虛析構函式?如果有乙個帶有虛函式功能的類,則它需要乙個虛析構函式,原因如下 1 如果乙個類有虛函式功能,它經常作為乙個基類使用 2 如果它是乙個基類,它的派生類經常使用new來分配 3 如果乙個派生類物件使用new來分配,並且通過乙個指向它的基類的指標來控制,那麼它經常通過乙個指向它...

虛析構和純虛析構

多型使用時,如果子類有屬性開闢到堆區,那麼父類指標在釋放時無法帶呼叫到子類的析構 解決方式 將父類的析構函式改為純虛析構或者虛析構 1.可以解決父類指標釋放子類物件 2.都必須要有具體的函式實現 虛析構和純虛析構的區別 如果是純虛析構,該類屬於抽象類,無法例項化物件 include include ...