部落格17 利用weak ptr解決 「迴圈引用「

2021-09-19 08:00:20 字數 983 閱讀 9215

內容:c++11後,我們有了新的智慧型指標可以使用,我們可以拋棄auto,而使用新的智慧型指標,其中shared_ptr指標在正常使用是沒有問題的,但是如果shared_ptr出現互相引用的時候,那麼就會出現迴圈引用,從而導致資源沒有辦法正確釋放。

測試**:

測試結果:

分析:當pa,pb構造時,他們的引用計數為1,接下來由於迴圈引用,導致兩者的引用計數為2,離開作用域後,引用計數都為1,因此不釋放資源。這就是迴圈引用導致的後果。

解決方法:利用weak_ptr就可以解決迴圈引用的問題,因為weak_ptr是弱引用型指標,是用來監視shared_ptr的,不會使引用計數增加,但是它不管理shared_ptr內部的指標,也就是資料指標,它是用來監視shared_ptr生命週期的,通過它的構造不增加引用計數,析構不減少引用計數這一點,從而解決了迴圈引用的問題。

測試**:

結果:

結果分析:首先建立的時候雙方的引用計數為1,接著pb賦值給pa->bptr這個會使pb的引用計數加1,此時為2,pa仍為1,接著pa賦值給pb->aptr這個由於是weak_ptr指標的構造,不會使它的引用計數加1,pa的引用計數為1,pb的引用計數為2,離開作用域後,pa計數為0,析構,pb計數為2-1=1,不析構,但是由於pa析構,pa中的bptr會析構,那麼引用計數減1,這時候pb引用計數為1-1=0,也析構。實現資源的完整釋放。

部落格第17周

1 通過ansible roles編排實現 httpd 角色的部署 劇本檔案結構建立 http服務主劇本模組定義 cat main.yml include group.yml include user.yml include install.yml include config.yml includ...

Django1 7開發部落格

基於最新的django1.7寫的,通俗易懂,非常適合新手入門。感謝博主!參考教程 教程目錄 使用django1.7開發部落格 1 入門篇 使用django1.7開發部落格 2 模型 使用django1.7開發部落格 3 部署 使用django1.7開發部落格 4 三部曲 使用django1.7開發部...

利用github page搭建部落格

很多人用 wordpress,你為什麼要用 github pages 來搭建?1 github pages有300m免費空間,資料自己管理,儲存可靠 2 學著用 github,享受 github 的便利,上面有很多大牛,眼界會開闊很多 3 順便看看 github 工作原理,最好的團隊協作流程 4 g...