2014-04-09 88 views
1

正確方法,我剛開始接觸boost::shared_ptr所以我四處搜尋工作,我看到有初始化它的幾種方法:初始化的boost :: shared_ptr的

boost::shared_ptr<MyClass> myclass = boost::shared_ptr<MyClass>(new MyClass()); 
boost::shared_ptr<MyClass> myclass = new MyClass(); 
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>(); 

和分配它:

boost::shared_ptr<MyClass> someOtherType::getMyClass(); 

boost::shared_ptr<MyClass> myclass = someOtherTypePointer->getMyClass(); 
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>(someOtherTypePointer->getMyClass()); 

哪一個是init/assign的首選方式,爲什麼?

謝謝。

+0

你應該糾正的例子:'class'是保留關鍵字: – manlio

+0

你分配的例子並不是真正的任務(它的副本initalizations) – AlexT

回答

5
(1) boost::shared_ptr<MyClass> c(boost::shared_ptr<MyClass>(new MyClass())); 
(2) boost::shared_ptr<MyClass> c(new MyClass()); 
(3) boost::shared_ptr<MyClass> c(boost::make_shared<MyClass>()); 

第一個是不必要的複雜。

(2)(3)看起來相似,但使用make_shared只要你能(即當你並不需要一個定製刪除:Are there any downsides with using make_shared to create a shared_ptr)。

make_shared

  • 是更有效的。它通常爲MyClass對象分配內存,爲shared_ptr的控制塊分配一個內存分配。相反,(2)執行至少兩個內存分配。因此,make_shared減少了分配開銷,內存碎片並提高了局部性(參見GotW #89點2)。
  • 避免了顯式的new(並且至少在C++ 11中,它更清晰:auto c(std::make_shared<MyClass>());)。

該作業的主要用途是當您要複製以前存在的boost::shared_ptr以共享同一對象的所有權。

如果您需要取得原始指針的所有權,您應該使用resetboost shared_ptr: difference between operator= and reset?)。