【问题标题】:Base class unique_ptr to derived class shared_ptr基类 unique_ptr 到派生类 shared_ptr
【发布时间】:2015-07-18 06:13:12
【问题描述】:

我有一个基类,我通过 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;
}

这是我想要的,但我知道这不是正确的方法,我想知道我怎么能做这样的事情。

【问题讨论】:

  • 放弃所有权,向下转型,将所有权传递给共享指针。

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


【解决方案1】:

几乎是正确的。

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

为此,您只需要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 的所有权。

【讨论】:

    猜你喜欢
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2021-11-26
    • 2022-01-24
    • 2017-03-23
    • 2016-02-24
    • 2015-07-23
    相关资源
    最近更新 更多