[英]correct way to initialize a variable of the type boost::shared_ptr<A>
[英]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
,共享同一对象的所有权。
如果你需要获得原始指针的所有权,你应该使用reset
( boost shared_ptr:operator =和reset之间的差异? )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.