結構分析
weak_ptr和shared_ptr都包含乙個_m_refcount資料成員,追溯其定義,內部包含乙個_sp_counted_base<_lp>* _m_pi。
shared_ptr能夠實現其功能依賴於對於多個shared_ptr只例項化乙個_sp_counted_base<_lp>。當我們通過某一shared_ptr初始化另一shared_ptr時,其會執行如下兩個步驟
1、this->_m_ptr = other->_m_ptr
2、this->_m_refcount._m_pi指向了other->_m_refcount._m_pi,並且將_m_use_count++,表示對乙個實體的引用增加1個。
當shared_ptr析構時,執行如下步驟
1、this->_m_refcount._m_pi->_m_use_count 減1
2、如果this->_m_refcount._m_pi->_m_use_count歸零,則析構this->_m_ptr所執行的記憶體空間。
3、如果this->_m_refcount._m_pi->_m_weak_count歸零,則析構this->_m_refcount._m_pi的空間
weak_ptr
weak_ptr必須依靠shared_ptr才能進行構造,其構造過程如下:
1、weak->_m_ptr = shared->_m_ptr
2、weak->_m_refcount._m_pi指向了shared->_m_refcount._m_pi,並且_m_weak_count++,表示存在乙個weak_ptr引用了此結構
weak_ptr析構時,執行如下步驟
1、this->_m_refcount._m_pi->_m_weak_count 減1
2、當this->_m_refcount._m_pi->_m_weak_count歸零時,則析構this->_m_refcount._m_pi的空間。
_m_pi分析
此結構就是實體的引用計數,他含有兩個計數_m_use_count,其表示shared_ptr的引用指向數目,當建立乙個指向此實體的shared_ptr時,_m_use_count +1,當乙個shared_ptr析構時,_m_use_count -1。如果乙個_m_use_count -1歸零時便會釋放此實體的記憶體空間。
但是這個引用計數什麼時候釋放?不僅只有shared_ptr指向此引用計數,還有weak_ptr指向此引用計數,所以這裡又引入了另乙個計數_m_weak_count,與shared_ptr相似,建立時+1,析構時-1。僅有當_m_weak_count歸零時才會對其進行釋放。
這也就是reference說的weak_ptr會延長計數存在時間的原因。
智慧型指標weak ptr
智慧型指標weak ptr主要用來協助shared ptr。不參與引用計數,但是有以下好處 1 打破遞迴的依賴關係 2 使用乙個共享的資源但是不要所有權,不新增引用計數 3 避免懸空指標。使用方法有二 方法一 boost shared ptrsp new std string method1 從sh...
智慧型指標 weak ptr
weak ptr是為了配合shared ptr而引入的一種智慧型指標,它更像是shared ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator 和 它的最大作用在於協助shared ptr工作,像旁觀者那樣觀測資源的使用情況.用法 weak ptr被設計為與sha...
智慧型指標 weak ptr
weak ptr weak ptr是為了配合shared ptr而引入的一種智慧型指標,它更像是shared ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator 和 它的最大作用在於協助shared ptr工作,像旁觀者那樣觀測資源的使用情況.用法 weak pt...