基础 class unique_ptr 到派生 class shared_ptr
Base class unique_ptr to derived class shared_ptr
我有一个基数 class,我将其与 unique_ptr 一起传递作为对函数的引用,我想 copy/move 它到派生的 class 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;
}
这是我想要的,但我知道这不是正确的方法,我想知道我怎么能做这样的事情。
你几乎正确。
std::make_shared
总是创建一个新对象,使用完美转发,所以除非有一个构造函数采用 std::unique_ptr&
,否则这不是你想要的。
为此,您只需要 std::unique_ptr
中的 std::shared_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
是个好主意,因为这样用户可以 明确地 使用 std::move(。 ..) 在他们的对象上只是为了说明他们将不再拥有 unique_ptr
的所有权。
我有一个基数 class,我将其与 unique_ptr 一起传递作为对函数的引用,我想 copy/move 它到派生的 class 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;
}
这是我想要的,但我知道这不是正确的方法,我想知道我怎么能做这样的事情。
你几乎正确。
std::make_shared
总是创建一个新对象,使用完美转发,所以除非有一个构造函数采用 std::unique_ptr&
,否则这不是你想要的。
为此,您只需要 std::unique_ptr
中的 std::shared_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
是个好主意,因为这样用户可以 明确地 使用 std::move(。 ..) 在他们的对象上只是为了说明他们将不再拥有 unique_ptr
的所有权。