關於shared ptr與weak ptr的使用

2021-08-15 04:18:21 字數 1170 閱讀 9531

shared_ptr是帶引用計數的智慧型指標,可以說大部分的情形選擇用shared_ptr不會出問題。那麼weak_ptr是什麼,應該怎麼用呢?

weak_ptr也是智慧型指標,但是比較弱,感覺沒什麼用。其實它的出現是伴隨shared_ptr而來,尤其是解決了乙個引用計數導致的問題:在存在迴圈引用的時候會出現記憶體洩漏。

關於迴圈引用,看下面這個小例子就足夠了:

#include 

#include

using

namespace

std;

using

namespace boost;

class bb;

class aa

~aa()

shared_ptr

m_bb_ptr; //!

};class bb

~bb()

shared_ptr

m_aa_ptr; //!

};int main()

執行結果:

可以看到由於aa和bb內部的shared_ptr各自儲存了對方的一次引用,所以導致了ptr_a和ptr_b銷毀的時候都認為內部儲存的指標計數沒有變成0,所以aa和bb的析構函式不會被呼叫。解決方法就是把乙個shared_ptr替換成weak_ptr。

#include 

#include

using

namespace

std;

using

namespace boost;

class bb;

class aa

~aa()

weak_ptrm_bb_ptr; //!

};class bb

~bb()

shared_ptr

m_aa_ptr; //!

};int main()

執行結果:

關於weak_ptr更詳細的說明可以閱讀boost的文件,絕對的寶庫。

shared ptr與make shared的用法

程式使用動態記憶體出於以下三種原因之一 1 程式不知道自己需要多少物件 2 程式不知道所需物件的準確型別 3 程式需要在多個物件間共享資料 shared ptr的用法 可以指向特定型別的物件,用於自動釋放所指的物件 eg shared ptrpointclouddlgpointer 指向型別為cdl...

關於兄弟與朋友

最近很忙很忙,星期五晚上幾乎徹夜加班,沒有一段完整的時間讓自己靜下心來思考,說說心裡話。有些東西有必要記下,因為時間長了,會遺忘的,甚至連回憶也留不下。很多年都沒有坐下來認真動筆寫字了,包括前幾篇寫的,我是用鍵盤敲出來的。前幾天想寫 one fine day,考慮到坐在電腦前沒有那麼多時間,我選擇用...

關於工作與生活

普通人 我發現中國人的勵志和國外的勵志存在非常大的不同,中國的勵志比較鼓勵人立下大志願,臥薪嘗膽,有朝一日成富成貴。而國外的勵志比較鼓勵人勇敢面對現實生活,面對普通人的困境,雖然結果也是成富成貴,但起點不一樣,相對來說,我覺得後者在操作上更現實,而前者則需要用999個失敗者來堆砌乙個成功者的故事。我...