基类unique_ptr到派生类shared_ptr

时间:2015-07-18 06:13:13

标签: c++ casting shared-ptr smart-pointers unique-ptr

我有一个基类,我使用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 个答案:

答案 0 :(得分:1)

几乎正确。

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);
}

另外,我发现通过rvalue-ref传递b_ptr是一个好主意,因为用户可以通过 explcitly 在其对象上使用std :: move(...)只是为了说明他们不再拥有unique_ptr的所有权。