【发布时间】: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 &或只是一个原始指针? -
@code_fodder:这既不是好主意也不是坏主意;这是不可能,不是没有返回一个裸指针或其他东西。
-
它与将原始指针放入智能指针然后手动释放/删除它处于同一级别。
标签: c++ shared-ptr unique-ptr