2017-07-27 56 views
0

如果調用fn()的結果是const std::shared_ptr<SomeType>,客戶將結果保存爲最佳類型是什麼?如何保存shared_ptr結果?

即:

auto result = fn(); 

m_myResult = result.get() //or something 

什麼類型應該m_myResult是什麼? SomeType *? 或SomeType? 或shared_ptr<SomeType>

+6

問你自己爲什麼該函數返回一個共享指針。 – juanchopanza

+5

爲什麼不'std :: shared_ptr '? –

+0

[shared_ptr :: get](http://en.cppreference.com/w/cpp/memory/shared_ptr/get)返回'T *'。 – mch

回答

2

A shared_ptr<>用於表示內存資源的共享所有權。指向同一對象的所有(適當創建的)shared_ptr<>共享其所有權:只有在指向它的最後一個shared_ptr<>被銷燬(或者reset(),見下文)時才刪除該對象。因此,如果你想

auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT 
raw_ptr->member_func(); // may crash 

那麼shared_ptr<>fn()返回被立即銷燬和指向的對象可能是太,或者它可以隨時後來被毀。在這種情況下,raw_ptr將變爲dangling pointer。爲了避免這種情況,你必須堅持所有權通過保持一個shared_ptr<>對象活着:

auto ptr = fn();   // move shared_ptr<>: pass ownership 
ptr->member_func();  // fine (unless fn() returned an empty pointer) 

現在,通過ptr管理的對象將不會被前ptr本身被刪除,除非你明確reset()它:

ptr.reset();    // removes ownership from ptr