我刚刚开始使用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的首选方式,为什么?
谢谢。
答案 0 :(得分:5)
(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<MyClass>());
)。分配的主要用途是,您希望复制以前存在的boost::shared_ptr
,以共享同一对象的所有权。
如果您需要获取原始指针的所有权,则应使用reset
(boost shared_ptr: difference between operator= and reset?)。