C++ 初始化boost::shared\u ptr的正确方法

C++ 初始化boost::shared\u ptr的正确方法,c++,boost,initialization,shared-ptr,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::ma

我刚刚开始使用
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=boost::shared_ptr(new myclass());
boost::shared_ptr myclass=new myclass();
boost::shared_ptr myclass=boost::make_shared();
以及分配:

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

boost::shared_ptr<MyClass> myclass = someOtherTypePointer->getMyClass();
boost::shared_ptr<MyClass> myclass = boost::make_shared<MyClass>(someOtherTypePointer->getMyClass());
boost::shared_ptr someOtherType::getMyClass();
boost::shared_ptr myclass=someOtherTypePointer->getMyClass();
boost::shared_ptr myclass=boost::make_shared(someOtherTypePointer->getMyClass());
哪种方式是init/assign的首选方式?为什么

谢谢。

(1)boost::shared_ptr c(boost::shared_ptr(new MyClass());
(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) boost::shared_ptr c(新的MyClass()); (3) boost::shared_ptr c(boost::make_shared());
第一个是不必要的复杂

(2) 和(3)看起来类似,但只要有可能(即不需要自定义删除程序时),就使用
make_shared

共享

  • 它的效率更高。它通常为
    MyClass
    对象和
    shared\u ptr
    的控制块分配内存,只分配一个内存。相反,(2)执行至少两次内存分配。因此
    make_shared
    减少了分配开销、内存碎片并改进了局部性(参见第2点)
  • 避免显式的
    new
    (并且,至少在使用C++11时,它更清晰:
    autoC(std::make_shared());
分配的主要用途是当您希望复制以前存在的
boost::shared_ptr
以共享同一对象的所有权时


如果您需要获得原始指针的所有权,您应该使用
reset
()。

您应该更正示例:
class
是保留关键字:您的赋值示例不是真正的赋值(它是副本初始化)