正确的方法来初始化boost :: shared_ptr

时间:2014-04-09 09:35:40

标签: c++ boost initialization 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的首选方式,为什么?

谢谢。

1 个答案:

答案 0 :(得分: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?)。