2010-09-02 46 views
2

想象一下,我在方法/函數的堆上創建Foo實例並將其傳遞給調用者。我會用什麼樣的智能指針?可以將scoped_ptr和shared_ptr混合在一起嗎?

smartptr new_foo() { 
    smartptr foo = new Foo(); 
    return foo; 
} 

void bar() { 
    smartptr foo = new_foo(); 
    foo->do_something(); 
    // now autodelete foo, don't need it anymore 
} 

好...現在:據我瞭解,從推動這些smartpointers,scoped_ptr的應該是在酒吧中使用的一個()。但我不能在foo()中創建它,因爲它不可複製。所以我必須在foo()中創建一個shared_ptr並將其返回。但是,我現在必須在bar()中使用shared_ptr,還是可以將它「投」到bar()中的shared_ptr?

編輯

謝謝您的回答至今!所以,現在我有兩個解決方案:

  • 只能使用boost::shared_ptr
  • 使用std::auto_ptr發電機FOO()和巴()

真誠boost::shared_ptr,我更喜歡只升壓解決方案和韓元不要將它與STL混合,除非這樣做的確有充分的理由。那麼,下一個問題:與混合解決方案相比,混合解決方案具有哪些優勢(的任何優勢)?

回答

2

提升文檔建議如果您transfering所有權,然後在此刻另一個選擇是,他們不混合

的auto_ptr例如

smartptr new_foo() { 
    std::auto_ptr<Foo> foo = new Foo(); 
    return foo; 
} 

void bar() { 
    std::auto_ptr<Foo> foo = new_foo(); 
    foo->do_something(); 
    // now autodelete foo, don't need it anymore 
} 

但是這將然後限制你如何使用new_foo()即你不能用它來填充的容器(沒有管理資源的其他方式)。 :(

用的C++ 0x和右值引用這將是一個的unique_ptr工作,這將取代auto_ptr的,只是你想要做什麼

+0

返回'auto_ptr'不限制什麼你可以這樣做;你可以使用它來初始化一個'shared_ptr',或者調用'release'並且用原始指針做任何你想做的事情(只要你記得最終刪除它) – 2010-09-02 10:31:57

+0

好吧,但它會重新調整你可以不要自己管理資源,這首先是要用到它的,或者至少你需要小心,即沒有容器的auto_ptr – 2010-09-02 10:50:35

+0

也許是最好的方法要說它只是auto_ptr有一些你需要注意的危險,unique_ptr會修復這些 – 2010-09-02 11:08:24

1

使用boost::shared_ptr

+0

我不確定我完全理解你的意思。你能解釋一下嗎? – craesh 2010-09-02 12:17:32

+0

在第一個示例中,您要返回包裝對象,以便您需要在被調用者和調用者之間「共享」目標對象的所有權。實例化並返回包裝在boost :: shared_ptr中的對象將完全實現這一功能,將所有權清晰地從被調用方轉移到調用方。在第二個示例中,由於目標對象是本地作用域,因此不需要所有權轉移,因此更簡單的scoped_ptr是合適的 - 在smartptr包裝器中使您的代碼異常安全,而不會有不必要的功能。 – 2010-09-02 12:43:09

+1

只有一個例子? – 2010-09-02 13:13:49

相關問題