繁体   English   中英

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

[英]Correct way to initialize 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的首选方式,为什么?

谢谢。

(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 (即当你不需要自定义删除器时: 使用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 ,共享同一对象的所有权。

如果你需要获得原始指针的所有权,你应该使用resetboost shared_ptr:operator =和reset之间的差异? )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM