【问题标题】:C++ primer 5 edition: shared_ptr initialized from uniqe_ptr?C++ 入门 5 版:shared_ptr 从 uniqe_ptr 初始化?
【发布时间】:2020-02-22 18:16:59
【问题描述】:

关于 C++ 入门 5 版。第 12 章动态内存:它是这样写的:

shared_ptr p(u); P从uniqe_ptru取得所有权;使u 为空。 shared_ptr p(q, d) 假定内置指针q 指向的对象的所有权。 q 必须可转换为 T*($4.11.2,第 161 页)。 p 将使用可调用对象 d(10.3.2 美元,第 388 页)代替 delete 来释放 q

  • 我不明白“假设所有权来自 unque_ptr 以及内置的对象...”。

谁能给我解释一下这一段?非常感谢。

【问题讨论】:

    标签: c++ c++11 smart-pointers


    【解决方案1】:

    这本书的类型不清楚。你需要一个右值引用到construct 一个来自unique_ptrshared_ptr

    template< class Y, class Deleter >
    shared_ptr( std::unique_ptr<Y,Deleter>&& r );
    

    检查此代码:

    unique_ptr<int> up{new int{10}};
    shared_ptr<int> sp(move(up));
    cout << *sp <<'\n';
    //cout << *up <<'\n'; // up is nullptr
    

    直播Godbolt


    智能指针管理它们拥有的原始指针的生命周期。 unique_ptr 不共享所有权,而 shared_ptr 共享。当你从一个unique_ptr 构造一个shared_ptr 时,你必须通过移动放弃它的所有权,并且unique_ptr 不能被复制。

    我认为通过使用“假设所有权”,作者想要说明,如果您以某种方式修改智能指针所拥有的指针,仍然会发生坏事。

    【讨论】:

    • 因为将unque_ptrl-value传递给shared_ptr的构造函数会产生错误。
    • @ItachiUchiwa 完全正确。因为你不能复制一个 unique_ptr
    • 或者我可以直接这样做:std::shared_ptr&lt;int&gt; spi(std::make_unique&lt;int&gt;(10))。因为make_unique 作为shared_ptr ctor 的参数会创建一个右值unique_ptr 是否正确?
    • @ItachiUchiwa 没问题。享受光荣的智能指针:)
    • 是的,当然!感谢你们所有的好成员总是拯救我的一天,因为我总是想了解学习。
    【解决方案2】:

    智能指针“拥有”(或者,或许更好的是,“管理”)底层原始指针或对象。

    unique_ptr 完全拥有指针,并在超出范围时将其删除。 shared_ptr 可能与其他 shared_ptrs 共享所有权,并且当最后一个 shared_ptr 超出范围时,将删除托管对象。

    因此,在您的示例中,新创建的 shared_ptr 接管了 unique_ptr 的所有权,而后者一无所有。

    【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2021-09-04
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多