第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

unique_ptr和shared_ptr之間的差異

unique_ptr和shared_ptr之間的差異

C++
Qyouu 2019-08-23 15:43:24
unique_ptr和shared_ptr之間的差異有人可以解釋shared_ptr和unique_ptr之間的差異嗎?
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經(jīng)驗 獲得超5個贊

這兩個類都是智能指針,這意味著它們會自動(在大多數(shù)情況下)釋放它們在無法再引用該對象時指向的對象。兩者之間的區(qū)別在于每種類型的指針有多少可以引用資源。


使用時unique_ptr,最多只能unique_ptr指向一個資源。當它unique_ptr被銷毀時,資源會自動回收。因為unique_ptr任何資源只能有一個,所以任何復制a的嘗試unique_ptr都會導致編譯時錯誤。例如,此代碼是非法的:


unique_ptr<T> myPtr(new T);       // Okay

unique_ptr<T> myOtherPtr = myPtr; // Error: Can't copy unique_ptr

然而,unique_ptr可移動使用新的移動語義:


unique_ptr<T> myPtr(new T);                  // Okay

unique_ptr<T> myOtherPtr = std::move(myPtr); // Okay, resource now stored in myOtherPtr

同樣,你可以這樣做:


unique_ptr<T> MyFunction() {

    unique_ptr<T> myPtr(/* ... */);


    /* ... */


    return myPtr;

}

這個成語意味著“我正在向您返回托管資源。如果您沒有明確捕獲返回值,那么資源將被清除。如果您這樣做,那么您現(xiàn)在擁有該資源的獨占所有權(quán)?!?通過這種方式,您可以將其unique_ptr視為更安全,更好的替代品auto_ptr。


shared_ptr另一方面,允許多個指針指向給定資源。當shared_ptr資源的最后一個被銷毀時,資源將被釋放。例如,此代碼完全合法:


shared_ptr<T> myPtr(new T);       // Okay

shared_ptr<T> myOtherPtr = myPtr; // Sure!  Now have two pointers to the resource.

在內(nèi)部,shared_ptr使用引用計數(shù)來跟蹤有多少指針引用資源,因此您需要注意不要引入任何引用周期。


簡而言之:


使用unique_ptr時您需要一個指針時單指針被銷毀,將被回收的對象。

shared_ptr當您想要多個指向同一資源的指針時使用。

希望這可以幫助!


查看完整回答
反對 回復 2019-08-23
?
森林海

TA貢獻2011條經(jīng)驗 獲得超2個贊

在指針中包裝指針時,unique_ptr不能有多個副本unique_ptr。的shared_ptr保持參考計數(shù)器,它計數(shù)所存儲的指針的副本的數(shù)目。每次shared_ptr復制a時,此計數(shù)器都會遞增。每次a shared_ptr被破壞時,該計數(shù)器遞減。當此計數(shù)器達到0時,存儲的對象將被銷毀。


查看完整回答
反對 回復 2019-08-23
?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

unique_ptr是一個輕量級的智能指針,如果你只有一個動態(tài)對象,一個消費者有唯一的(因此“獨特”)責任 - 可能是一個需要維護一些動態(tài)分配對象的包裝類。unique_ptr開銷很小。它不可復制,但可移動。它的類型template <typename D, typename Deleter> class unique_ptr;,所以它取決于兩個模板參數(shù)。

unique_ptr也是auto_ptr想要在舊的C ++中,但由于該語言的限制而無法實現(xiàn)。

shared_ptr另一方面是一種非常不同的動物。顯而易見的區(qū)別在于,您可以讓許多消費者共同負責動態(tài)對象(因此“共享”),并且只有在所有共享指針消失后才會銷毀該對象。此外,您可以觀察弱指針,如果他們關(guān)注的共享指針消失,將會智能地通知它們。

在內(nèi)部,shared_ptr還有更多內(nèi)容:有一個引用計數(shù),它以原子方式更新以允許在并發(fā)代碼中使用。此外,還有大量的分配,一個用于內(nèi)部簿記“參考控制塊”,另一個用于實際的成員對象。

但是還有另一個很大的區(qū)別:共享指針類型總是如此 template <typename T> class shared_ptr;,盡管您可以使用自定義刪除器自定義分配器對其進行初始化。使用類型擦除和虛函數(shù)調(diào)度來跟蹤刪除和分配器,這增加了類的內(nèi)部權(quán)重,但是具有巨大的優(yōu)點,即不同類型的共享指針T都是兼容的,無論刪除和分配細節(jié)如何。因此,他們真正表達了“共同責任T” 的概念,而不會給消費者帶來細節(jié)!

二者shared_ptrunique_ptr設(shè)計成由值傳遞(與用于唯一的指針明顯的可移動性要求)。也不應(yīng)該讓你擔心開銷,因為他們的力量確實令人震驚,但如果你有選擇,更喜歡unique_ptr,只有shared_ptr在你真正需要共同責任時才使用。


查看完整回答
反對 回復 2019-08-23
  • 3 回答
  • 0 關(guān)注
  • 1877 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號