创建共享指针的首选方法

men*_*oom 4 c++ qt smart-pointers

该文档指出std::make_shared<T>通常分配用于存储T在对比一次和智能指针的控制块std::shared_pointer<T>(new T),它执行两个分配.这是否意味着它更有效率,因此std::make_shared如果可能的话应该总是使用它?

关于Qt等价的相同问题 - QSharedPointer.根据文档,QSharedPointer内部和对象分配在一个单独的内存分配中,这可以帮助减少长时间运行的应用程序中的内存碎片.这是否QSharedPointer<T>::create()是首选?

class MyClass {};

QSharedPointer<MyClass> ptr1 = QSharedPointer<MyClass>::create();   // better
QSharedPointer<MyClass> ptr2(new MyClass);  // worse
Run Code Online (Sandbox Code Playgroud)

xax*_*xon 10

std::make_shared几乎在每种情况下都是首选.但是,如果你使用弱指针,你很容易陷入"内存泄漏"的情况,在这种情况下,内存的存储时间远远超过你第一眼看到的时间(在所有shared_ptrs消失之后).

只要存在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}.