上篇文章介紹了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 ...