weak ptr和shared ptr功能總結

2021-10-08 23:43:28 字數 1405 閱讀 8023

結構分析

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...