c – 正确初始化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(即你不需要自定义删除器: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?).
标签:c,shared-ptr,initialization,boost 来源: https://codeday.me/bug/20190830/1771480.html