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}}
答案 0 :(得分:10)
std::make_shared
都是首选。但是,如果你使用弱指针,你很容易陷入&#34;内存泄漏&#34;内存保持的时间远远超过你乍一看的时间(在所有shared_ptr
之后都消失了)。
只要std::weak_ptr
与std::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}
。