c 的弱引用指標到底是為什麼目的引入的?原理是咋回事

時間 2021-05-14 12:07:25

1樓:冒泡

原始指標其實也算是乙個弱指標(理念上),專門弄個弱指標型別,我的理解是如果物件被釋放了,用原始指標會崩潰,用弱指標訪問當然也會出問題,不過不會用那麼粗暴的方式給你報錯

2樓:馮海

weak_ptr提供的是弱繫結,要不然在post 任務的時候,會延長物件的生命週期,建議看看@陳碩的神作,裡面介紹得很好

3樓:zihuatanejo

首先,不要把智慧型指標和祼指標的區別看得那麼大,它們都是指標。因此,我們可以把智慧型指標和祼指標都統稱為指標,它們共同的目標是通過位址去代表資源。既然指標能代表資源,那麼不可避免地會涉及資源的所有權問題。

在選擇具體指標型別的時候,通過問以下幾個問題就能知道使用哪種指標了。

指標是否需要擁有資源的所有權?

如果指標變數需要繫結資源的所有權,那麼會選擇unique_ptr或shared_ptr。它們可以通過RAII完成對資源生命期的自動管理。如果不需要擁有資源的所有權,那麼會選擇weak_ptr和raw pointer,這兩種指標變數在離開作用域時不會對其所指向的資源產生任何影響。

如果指標擁有資源的所有權(owning pointer),那麼該指標是否需要獨佔所有權?

獨佔則使用unique_ptr(人無我有,人有我丟),否則使用shared_ptr(你有我有全都有)。這一點很好理解。

如果不擁有資源的所有權(non-owning pointer),那麼指標變數是否需要在適當的時候感知到資源的有效性?

如果需要則使用weak_ptr,它可以在適當的時候通過weak_ptr::lock()獲得所有權,當擁有所有權後便可以得知資源的有效性。如不需要,則使用祼指標。

這通常是程式設計師知道在祼指標的作用域內它是有效的,並且使用祼指標效率更高,例如

autop=

make_shared

(1

);auto

result=f

(p.get

());

這樣會衍生出另外乙個問題,為何unique_ptr不能和weak_ptr配合?

這是因為unique_ptr是獨佔所有權,也就是說資源的生命期等於指標變數的生命期,那麼程式設計師可以很容易通過指標變數的生命期來判斷資源是否有效,這樣weak_ptr就不再有必要了。而相對來說,shared_ptr則不好判斷,特別是多執行緒環境下。

另外,很多人說weak_ptr的作用是可以破除迴圈引用,這個說法是對的,但沒有抓住本質(祼指標也可以破除,那為何要用weak_ptr?)。寫出迴圈引用的原因是因為程式設計師自己沒有理清楚資源的所有權問題。

4樓:QAMichaelPeng

weak_ptr的用法樓上幾位都講的很清楚了。俺補充一下實現原理吧。

weak_ptr 只能由shared_ptr或者其它的weak_ptr構造。參見 std::weak_ptr::weak_ptr

關於shared_ptr的實現,可以參見 make a shared_ptr from scratch . weak_ptr和shared_ptr共享乙個引用計數物件,在引用計數物件上增加乙個weak_count, 但不增加ref_count.引用計數物件當ref_count減至zero時會銷毀其管理的資源,weak_ptr可以通過ref_count是否為0來判斷指向的資源是否可用。

當ref_count和weak_count都為0時引用計數物件會銷毀其自身。

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...

練武的目的到底是為什麼?

綠松石部落 可以用來修身養性,益壽延年啊。最起碼身體健康,不給家人找麻煩,身心平衡,生活品質會提高很多,吃得睡得玩得。如果想要更高的追求,以藝進道較為穩妥,這個藝可以是通過練武,用練武來減少妄念,增加身體及精神上的感悟,提高智慧型。 正經的花銀師兄 練畫畫的目的到底是為什麼?有相機,還用畫畫嗎?練刺...

玩語c的根本目的到底是什麼?

霧栒 混圈難道不就是圖個開心嗎?有一堆和自己志同道合三觀相符的人,能一起磨練文筆是真的,也能聊一些三次不大理解的事情,沒事兒還能面個基吐個槽有啥不好的?至於說什麼在校被孤立在網上找安慰.那個,混圈六年,周圍人包括我在內,三次朋友沒比圈內少,還有少部分被帶進圈。玩語c需要有什麼目的嗎?喜歡就玩啊。 童...