【问题标题】:Correct way to initialize boost::shared_ptr初始化 boost::shared_ptr 的正确方法
【发布时间】:2014-04-09 09:35:40
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 您应该更正示例:class 是保留关键字:
  • 你的赋值示例并不是真正的赋值(它是复制初始化)

标签: c++ boost initialization shared-ptr


【解决方案1】:
(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&lt;MyClass&gt;());)。

分配的主要用途是当您想要复制先前存在的boost::shared_ptr,以共享同一对象的所有权。

如果您需要获取原始指针的所有权,您应该使用reset (boost shared_ptr: difference between operator= and reset?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2019-10-03
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多