gpt4 book ai didi

c++ - 创建共享指针的首选方式

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:26 25 4
gpt4 key购买 nike

documentation指出std::make_shared<T>通常为 T 分配内存和智能指针的控制 block 立即对比 std::shared_pointer<T>(new T) ,执行两次分配。这是否意味着它更有效率,因此应该始终使用 std::make_shared如果可能的话?

关于 Qt 等效项的相同问题 - QSharedPointer .根据docs QSharedPointer内部结构和对象分配在一个内存分配中,这有助于减少长时间运行的应用程序中的内存碎片。是不是表示QSharedPointer<T>::create()是首选吗?

class MyClass {};

QSharedPointer<MyClass> ptr1 = QSharedPointer<MyClass>::create(); // better
QSharedPointer<MyClass> ptr2(new MyClass); // worse

最佳答案

std::make_shared几乎在所有情况下都是首选。但是,如果您使用弱指针,您很容易陷入“内存泄漏”的境地,即内存保留的时间比您乍看之下想象的要长得多(毕竟 shared_ptr 都消失了)。

只要有一个std::weak_ptrstd::shared_ptr 相关联控制 block ,控制 block 必须保留。自 std::make_shared为控制 block 和数据创建单个内存分配,如果控制 block 保留,则数据也必须保留。与 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} .

关于c++ - 创建共享指针的首选方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39888995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com