2013-10-07 53 views
7

從我所做的研究中,聽起來像std::make_shared是構建std::shared_ptr的首選方式。具體而言,因爲:有沒有我不會使用std :: make_shared的情況?

使用 new,其執行至少兩個被比較
  1. 它執行僅一個內存分配。
  2. 如果傳遞給make_shared的ctor拋出,那麼它不會泄漏,因爲它會與新的。

我的問題是,假設我想一個shared_ptr,我應該總是使用make_shared,還是有地方new是優選的情況下?

+0

'shared_ptr (new int)'''shared_ptr'構造函數拋出時不會泄漏內存;這是你的第二點似乎暗示給我的。 – Simple

回答

6

由於計數器和對象共享相同的分配,它們也共享相同的釋放。

該計數器必須持續到最後的shared_ptrweak_ptr消失。如果你有一個持久的大對象(或許多小對象),如果你通過make_shared分配shared_ptr s,這可能會導致內存爭用。其次,如果你有一個第三方API提供了一個指針或資源句柄,並且可能有自己的處置功能,那麼make_shared既不適合也不可能在任何情況下使用。創建你自己的make_函數可以避免混亂的細節讓你處理這個問題,並處理異常的情況。

最後,雖然共享指針很棒,但它們也過於強大。通常我想要一個unique_ptr甚至是一個boost::scoped_ptr,或者一個侵入式引用計數指針等來表示所有權。 shared_ptr只適用於實際涉及的情況共享資源的所有權:因爲它很「容易」而使用它,往往會以相當於意大利麪代碼的資源結束。

+4

最後一段的獎勵分數。雖然這個問題沒有直接提出,但在這方面不能說得通。 –

2

您可能需要處理返回動態分配對象的遺留代碼。在這種情況下,您需要將指針參數與std::shared_ptr<T> ctor一起使用。使用std::make_shared並不是最好,但它確實允許您在遺留代碼中使用所有std::shared_ptr<T>

我知道這並不等於直接使用std::shared_ptr<T> ctor與new,但它是一個有效的使用案例std::shared_ptr<T>,其中make_shared無法使用。

0

我遇到了使用make_shared對具有私有構造函數的類(來自靜態工廠方法)的問題。我不認爲有這樣一個簡單的解決方案。

+0

我認爲這有一個缺陷,你應該能夠使'make_shared'成爲朋友嗎?標準尚不清楚它是否會起作用。 – Simple

+0

我做了一個解決方法,可以讓你使用'make_shared'和一個「private」構造函數:http://ideone.com/O93w6o – Simple

1

我對你的問題的解釋有點不確定。我認爲使用shared_ptr<T>是合理的;我只能第二個Yakk關於爲什麼你不想首先使用shared_ptr的原因。

有一個情況下,你不能使用make_sharedallocate_shared構建shared_ptr但你需要使用相應的構造函數:如果您需要在定製刪除通過,見(3)及(4)the ctors of shared_ptr

0

我就應該總是用make_shared,還是有情況下,新的 首選

make_shared當我們存儲shared_ptr赤裸裸的指針由別人分配是不允許的。它只能調用public構造函數。但是在某些編譯器中有一些關於使用make_shared like this訪問受保護構造函數的報告。

相關問題