初始化提升::shared_ptr的正确方法

Correct way to initialize boost::shared_ptr

本文关键字:方法 ptr shared 初始化      更新时间:2023-10-16

我刚刚开始使用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());

哪一种是初始化/分配的首选方式,为什么?

谢谢。

(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时,以共享同一对象的所有权。

如果你需要获得原始指针的所有权,你应该使用reset(boost shared_ptr:operator= 和 rereset 之间的区别?