【问题标题】:raw pointer works in vector<T> while unique_prt does not原始指针在 vector<T> 中有效,而 unique_prt 无效
【发布时间】:2013-07-27 19:37:12
【问题描述】:
    vector<Universe*> vtd;
    Sweet* ptr = new Sweet();
    vtd.push_back(ptr); <--- WORKS FINE!

    vector<unique_ptr<Universe>> vtd;
    unique_ptr<Sweet> X (new Sweet());
    vtd.push_back(X); <--- Intellsense error!

为什么简单地用 unique_ptr 替换原始指针在这种情况下不起作用?

宇宙是一个类,

Sweet:Univers 是派生类

【问题讨论】:

    标签: c++ pointers c++11 unique-ptr


    【解决方案1】:

    试试vtd.push_back(std::move(X))

    【讨论】:

    • 谢谢你,成功了。我会去谷歌搜索更多关于移动操作符的信息,以确切了解为什么会这样。
    【解决方案2】:

    std::unique_ptr 背后的原因是在任何给定时间只能有一个指针的所有者,考虑到这一点,我们可以很容易地发现 std::unique_ptr 是不可复制的。

    std::vector::push_back 通常会复制它的参数,然后存储该副本,但由于我们无法复制 std::unique_ptr,除非我们采取一些措施,否则它将失败。

    要将std::unique_ptr 存储在std::vector 中,我们需要将std::move 所有权放入向量中,使我们拥有的所有权无效。


    std::vector<std::unique_ptr<Obj>> vec;
    
    std::unique_ptr<Obj> my_ptr (new Obj);
    
    vec.push_back (std::move (my_ptr)); /* `vec` now owns the pointer,
                                           my_ptr points to nothing    */
    

    【讨论】:

    • 谢谢!我不明白为什么它失败了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多