【问题标题】:Why must shared_ptr<> allocate for the control block and managed object separately?为什么 shared_ptr<> 必须分别为控制块和托管对象分配?
【发布时间】:2014-10-14 02:48:39
【问题描述】:

此链接问题询问 make_shared&lt;&gt; 函数和 shared_ptr&lt;&gt; 构造函数是否不同。

What happens when using make_shared

部分答案是make_shared&lt;&gt; 通常会在一次分配中同时为指向对象和智能指针控制块分配内存。 shared_ptr&lt;&gt; 构造函数使用两个分配。

cppreference 声明构造函数“必须”这样做,但没有给出任何理由。

这是为什么?由于某种原因是不可能的吗?还是因为其他原因被标准禁止?

【问题讨论】:

    标签: c++ c++11 shared-ptr make-shared


    【解决方案1】:

    想想std::shared_ptr 构造函数是如何工作的:

    std::shared_ptr<Foo>(new Foo());
    

    首先评估new Foo() 表达式; ::operator newFoo 对象分配内存,然后构造它。结果指针作为参数传递给std::shared_ptr 构造函数。

    看到问题了吗? Foo 分配已经执行!智能指针构造函数没有选项在同一分配中为控制块和对象分配空间,因为它不负责为对象分配内存。

    另一方面,

    std::make_shared 负责 两个 分配,因此 可以在一个堆分配中为两者分配空间,然后再进行放置-new-在该分配中同时构造对象和控制块。

    【讨论】:

    • 哦,天哪……今天真是漫长的一天,嗯,是的……谢谢!
    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多