代码之家  ›  专栏  ›  技术社区  ›  joaomlap

基类unique_ptr到派生类shared_ptr

  •  1
  • joaomlap  · 技术社区  · 11 年前

    我有一个基类,我将它与unique_ptr一起作为函数的引用传递,我想将它复制/移动到派生类shared_ptr(或unique_ptr-我希望它也能保证在整个执行过程中不会泄漏内存)。

    我正在这样做:

    std::shared_ptr<Derived> f(unique_ptr<Base>& b_ptr){
    
        std::shared_ptr<Derived> d_ptr= std::make_shared<Base>(std::move(b_ptr));
        return d_ptr;
    }
    

    这是我想要的,但我知道这不是正确的方式,我想知道我如何才能做到这一点。

    1 回复  |  直到 11 年前
        1
  •  1
  •   Russell Greene    11 年前

    你是 几乎 对的

    std::make_shared 总是使用完美的转发创建一个新对象,所以除非有构造函数使用 std::unique_ptr& ,那不是你想要的。

    为了做到这一点,您只需要 std::shared_ptr 的构造函数 std::unique_ptr 然后使用 std::static_pointer_cast 功能:

    #include <memory>
    #include <iostream>
    
    class Parent{ virtual ~Parent(); };
    
    class Derived : public Parent { };
    
    std::shared_ptr<Derived> f(std::unique_ptr<Parent>&& b_ptr)
    {
        auto shared_base = std::shared_ptr < Parent > {std::move(b_ptr)};
    
        return std::static_pointer_cast<Derived>(shared_base);
    }
    

    而且,我觉得通过考试是个好主意 b_ptr 通过右值ref,因为这样用户就可以 解释性地 在对象上使用std::move(…)只是为了说明他们不会拥有 unique_ptr 不再