從我所做的研究中,聽起來像std::make_shared
是構建std::shared_ptr
的首選方式。具體而言,因爲:有沒有我不會使用std :: make_shared的情況?
new
,其執行至少兩個被比較
- 它執行僅一個內存分配。
- 如果傳遞給make_shared的ctor拋出,那麼它不會泄漏,因爲它會與新的。
我的問題是,假設我想一個shared_ptr,我應該總是使用make_shared
,還是有地方new
是優選的情況下?
從我所做的研究中,聽起來像std::make_shared
是構建std::shared_ptr
的首選方式。具體而言,因爲:有沒有我不會使用std :: make_shared的情況?
new
,其執行至少兩個被比較
我的問題是,假設我想一個shared_ptr,我應該總是使用make_shared
,還是有地方new
是優選的情況下?
由於計數器和對象共享相同的分配,它們也共享相同的釋放。
該計數器必須持續到最後的shared_ptr
和weak_ptr
消失。如果你有一個持久的大對象(或許多小對象),如果你通過make_shared
分配shared_ptr
s,這可能會導致內存爭用。其次,如果你有一個第三方API提供了一個指針或資源句柄,並且可能有自己的處置功能,那麼make_shared
既不適合也不可能在任何情況下使用。創建你自己的make_
函數可以避免混亂的細節讓你處理這個問題,並處理異常的情況。
最後,雖然共享指針很棒,但它們也過於強大。通常我想要一個unique_ptr
甚至是一個boost::scoped_ptr
,或者一個侵入式引用計數指針等來表示所有權。 shared_ptr
只適用於實際涉及的情況共享資源的所有權:因爲它很「容易」而使用它,往往會以相當於意大利麪代碼的資源結束。
最後一段的獎勵分數。雖然這個問題沒有直接提出,但在這方面不能說得通。 –
您可能需要處理返回動態分配對象的遺留代碼。在這種情況下,您需要將指針參數與std::shared_ptr<T>
ctor一起使用。使用std::make_shared
並不是最好,但它確實允許您在遺留代碼中使用所有std::shared_ptr<T>
。
我知道這並不等於直接使用std::shared_ptr<T>
ctor與new
,但它是一個有效的使用案例std::shared_ptr<T>
,其中make_shared
無法使用。
我對你的問題的解釋有點不確定。我認爲使用shared_ptr<T>
是合理的;我只能第二個Yakk關於爲什麼你不想首先使用shared_ptr
的原因。
有一個情況下,你不能使用make_shared
或allocate_shared
構建shared_ptr
但你需要使用相應的構造函數:如果您需要在定製刪除通過,見(3)及(4)the ctors of shared_ptr
。
我就應該總是用make_shared,還是有情況下,新的 首選
make_shared
當我們存儲shared_ptr
赤裸裸的指針由別人分配是不允許的。它只能調用public
構造函數。但是在某些編譯器中有一些關於使用make_shared like this訪問受保護構造函數的報告。
'shared_ptr(new int)'''shared_ptr'構造函數拋出時不會泄漏內存;這是你的第二點似乎暗示給我的。 –
Simple