如果我用指向它的 shared_ptr 重置 unique_ptr 会发生什么?

what happens if I reset a unique_ptr with a shared_ptr pointing to it?

如果这个问题还没有在某个地方得到解答,我会感到很惊讶。但是我没有找到。

无论如何,正如问题所说,我想知道如果我从一个唯一指针创建一个共享指针会发生什么。我看到了来自 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());

这让我开始思考,如果我做了类似的事情 - 我有一个拥有对象,它具有 returns 一些内部对象的功能 unique_ptr - 我做了一个 shared_ptr 出来(也许正如 link 中所建议的那样)。然后,如果该拥有对象销毁/重置其内部对象 - 那么我的 shared_ptr 会发生什么?

我知道这不是 link 所建议的 - 但我不太确定这是“良好做法”还是“未定义的行为” - 据我所知,这将导致悬空 shared_ptr...

where I have an owning-object that has a function that returns some internal object by unique_ptr - and I make a shared_ptr out of it (perhaps as suggested in the link). Then later if that owning-object

停止。你自相矛盾了。如果对象 X 拥有对象 Y,并且它 return 是 Y 的 unique_ptr,它 不再拥有 Y。这就是 return 对某物 unique_ptr 的意思。

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

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