从std::shared_ptr转移到std::unique_ptr的所有权

17

我有一个类 A,它拥有一个类型为 std::unique_ptr 的字段:

class A
{
public:
   std::unique_ptr pointer;
// class body
};

在我的代码中,我使用了几个指向相同对象的std::shared_ptr。现在我想要实现的是将所有权转移到这个类中的std::unique_ptr,以便如果所有shared_ptr都被销毁,我的对象将会一直存在,只要这个unique_ptr还活着。

我的问题是 - 是否可能从std::shared_ptr转移所有权到std::unique_ptr,如果可以,应该如何做?


8
在逻辑上,这种情况对我来说没有意义。暂且假设可能转移所有权,但只能在确保只有一个 shared_ptr 存活的情况下才能进行;如果是这种情况,那么你仍然可以将 shared_ptr 作为 A 的成员使用,并 假装 它是 unique_ptr - Nawaz
1
将所有 shared_ptr 的所有权移交给我的类中的这个 std::unique_ptr,这样如果所有 shared_ptr 都被销毁,只要这个 unique_ptr 存在,我的对象就会一直存在... 为什么不在 A 中再创建一个 shared_ptr 呢? - qPCR4vir
1
如果还有N个其他的shared_ptr指向同一个对象怎么办?你该如何处理?shared_ptr没有提供release方法是有原因的。 - user1773602
1
也许你想要的是在A中使用shared_ptr,而在其他所有地方使用weak_ptr? - qPCR4vir
3
在这种情况下,你正在寻找错误的智能指针。你可能需要的是称为 std::weak_ptr 的指针。如果是这样,请确保使用一个 std::shared_ptr,而其他所有指针都是 std::weak_ptr - Nawaz
显示剩余2条评论
1个回答

16

从逻辑上讲,这种情况对我来说没有意义。

假设你可以转移所有权,但仅当你确定只有一个shared_ptr处于活动状态时才能这样做;如果是这种情况,则仍然可以将shared_ptr用作A类的成员,并且假装它是unique_ptr

然后你评论道:

  

没错,我可以在A类中创建shared_ptr。 我想我又误解了一个概念。 我希望以这种方式表现它:如果unique_ptr死亡,则对象本身也死亡,即使shared_ptr仍然指向它,但这很愚蠢,因为他们不会知道对象本身被销毁了,因此它们将不是nullptr

在这种情况下,您正在寻找错误的智能指针。 您可能需要的是称为std::weak_ptr的东西。 如果是这样,请确保使用一个std::shared_ptr和所有其他指针均使用std::weak_ptr


5
事实上,这种情况对我来说是合法的,因为我的代码使用了unique_ptr(有很好的理由),但是我必须从一个无法处理非可复制类型的库中获取数据。当然,我想修复该库,但上游和部署需要时间,所以就是这样了。 - Victor Mataré

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接