其他分享
首页 > 其他分享> > c – 正确初始化boost :: shared_ptr的方法

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