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

Use*_*rIq 3 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>();
Run Code Online (Sandbox Code Playgroud)

分配它:

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

boost::shared_ptr<MyClass> myclass = someOtherTypePointer->getMyClass();
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>(someOtherTypePointer->getMyClass());
Run Code Online (Sandbox Code Playgroud)

哪一个是init/assign的首选方式,为什么?

谢谢.

man*_*lio 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>());
Run Code Online (Sandbox Code Playgroud)

第一个是不必要的复杂.

(2)(3)似乎相似但make_shared只要你可以使用(即当你不需要自定义删除器时:使用make_shared创建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,以共享同一对象的所有权时.

如果您需要获取原始指针的所有权,您应该使用reset(boost shared_ptr:operator =和reset之间的差异?).