【问题标题】:what happens if I reset a unique_ptr with a shared_ptr pointing to it?如果我用指向它的 shared_ptr 重置 unique_ptr 会发生什么?
【发布时间】:2021-04-25 19:47:53
【问题描述】:

如果这在某个地方没有得到回答,我会感到惊讶。但是我没找到。

无论如何,正如问题所说,我想知道如果我从唯一指针创建共享指针会发生什么。看到here的一些建议:

// Factor that returns unique_ptr
std::unique_ptr<ModelObject_Impl> factory();

// Store a shared_ptr to that returned unique_ptr
auto shared = std::shared_ptr<ModelObject_Impl>(factory());

这让我想到如果我做了类似的事情——我有一个拥有对象,它有一个通过 unique_ptr 返回一些内部对象的函数——我用它制作了一个 shared_ptr(也许正如链接中所建议的那样)。然后,如果该拥有对象销毁/重置其内部对象 - 那么我的 shared_ptr 会发生什么?

我知道这不是链接建议做的事情——但我不太确定这是“好的做法”还是“未定义的行为”——据我所知,这会导致悬空shared_ptr...

【问题讨论】:

  • "我有一个拥有对象,它有一个函数,通过 unique_ptr 返回一些内部对象......如果那个拥有对象" 这是一个矛盾。如果对象 X 拥有对象 Y,并且它返回一个 unique_ptr 给 Y,则它不再拥有 Y。这就是将 unique_ptr 返回给某物的含义。
  • 我会说,如果您的代码最终以相同的内存地址同时包装在两种智能指针中,那么您的代码就有问题。智能指针是所有者,同一位置只能有一个所有者。
  • @NicolBolas 啊,所以,我认为您是在说这是“一个坏主意” - 通常,如果您必须这样做,您可能会传回 const &amp; 或只是一个原始指针?
  • @code_fodder:这既不是好主意也不是坏主意;这是不可能,不是没有返回一个裸指针或其他东西。
  • 它与将原始指针放入智能指针然后手动释放/删除它处于同一级别。

标签: c++ shared-ptr unique-ptr


【解决方案1】:

我有一个拥有对象,该对象具有一个函数,该函数通过 unique_ptr 返回一些内部对象-我从中创建了一个 shared_ptr (可能如链接中所建议的那样)。然后稍后如果那个拥有对象

停下来。你已经自相矛盾了。如果对象 X 拥有对象 Y,并且它返回一个 unique_ptr 给 Y,它不再拥有 Y。这就是将 unique_ptr 返回给某物的含义。

如果它返回了对 unique_ptr 的引用,那没关系,因为你要么从它移到 shared_ptr(在这种情况下,X 不再拥有它),要么你没有,在这种情况下不拥有它。无论哪种方式,所有权都是独一无二的。

unique_ptr 创建shared_ptr 意味着shared_ptr 声明对该对象的所有权。 unique_ptr 之后不再拥有它。这就是为什么它需要对unique_ptr 进行右值引用;您必须将移入shared_ptr

【讨论】:

  • 出于我自己的理智,我试图做到这一点 - 我不能(如你所料) - 好吧,我可以通过使用 std::move 返回一个成员 unique_ptr - 但这只是将所有权从“拥有对象”。很好的答案,有点愚蠢的问题谢谢:)
  • @code_fodder • 不是一个愚蠢的问题;所有权以及智能指针如何影响所有权是一件棘手的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2016-03-06
相关资源
最近更新 更多