创建共享指针的首选方法

时间:2016-10-06 06:29:37

标签: c++ qt smart-pointers

std::make_shared<T>表示T通常为std::shared_pointer<T>(new T)和智能指针的控制块分配内存,与执行两次分配的std::make_shared形成对比。这是否意味着它更有效率,因此如果可能,应该始终使用QSharedPointer

关于Qt等价物的相同问题 - QSharedPointer。根据{{​​3}} QSharedPointer<T>::create()内部结构,对象在一个内存分配中分配,这有助于减少长时间运行的应用程序中的内存碎片。这是否意味着class MyClass {}; QSharedPointer<MyClass> ptr1 = QSharedPointer<MyClass>::create(); // better QSharedPointer<MyClass> ptr2(new MyClass); // worse 是首选的?

{{1}}

1 个答案:

答案 0 :(得分:10)

几乎在所有情况下,

std::make_shared都是首选。但是,如果你使用弱指针,你很容易陷入&#34;内存泄漏&#34;内存保持的时间远远超过你乍一看的时间(在所有shared_ptr之后都消失了)。

只要std::weak_ptrstd::shared_ptr控制块关联,控制块就必须保留。由于std::make_shared为控制块和数据创建单个内存分配,因此如果控制块保留,则数据也必须保留。使用std::shared_ptr,有两个分配,因此可以单独清理它们。

因此,如果您未使用std::weak_ptr(下面的其他警告),绝对总是更喜欢std::make_shared的好处,包括分配数量和异常安全性。如果您使用的是std::weak_ptr,那么您的设计必须更加周到。

Modern Effective C ++ 第4章专门介绍如何/何时使用不同的智能指针。它是现有c ++程序员的简明书,可以了解c ++ 11/14中的新功能,包括智能指针。

编辑:正如@midor提到的那样,在使用std::make_shared时,您也无法提供自定义删除工具。此外,如果类型T具有可以使用相同类型调用的不同构造函数,但是一个具有()且一个具有{}的构造函数,那么它将始终优先使用()的构造函数。例如,std::make_shared<std::vector>(10,10)调用std::vector(10,10)而非std::vector{10,10}