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當您想要多個指向同一資源的指針時使用。
希望這可以幫助!

TA貢獻2011條經(jīng)驗 獲得超2個贊
在指針中包裝指針時,unique_ptr
不能有多個副本unique_ptr
。的shared_ptr
保持參考計數(shù)器,它計數(shù)所存儲的指針的副本的數(shù)目。每次shared_ptr
復制a時,此計數(shù)器都會遞增。每次a shared_ptr
被破壞時,該計數(shù)器遞減。當此計數(shù)器達到0時,存儲的對象將被銷毀。

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_ptr
并unique_ptr
設(shè)計成由值傳遞(與用于唯一的指針明顯的可移動性要求)。也不應(yīng)該讓你擔心開銷,因為他們的力量確實令人震驚,但如果你有選擇,更喜歡unique_ptr
,只有shared_ptr
在你真正需要共同責任時才使用。
- 3 回答
- 0 關(guān)注
- 1877 瀏覽
添加回答
舉報