如果我用指向它的 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
.
如果这个问题还没有在某个地方得到解答,我会感到很惊讶。但是我没有找到。
无论如何,正如问题所说,我想知道如果我从一个唯一指针创建一个共享指针会发生什么。我看到了来自 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
.