移动和重新分配后的unique_ptr

4
以下操作是否安全?
auto pt = getUniquePtr();
while (pt) {
  vector_of_objects.push_back(std::move(pt));
  pt = getUniquePtr();
}

getUniquePtr 返回一个 unique_ptr<MyObject>。我认为,在移动对象后,如果我重新分配其他东西给pt,这不应该有影响,对吗?

3个回答

2

好的,这没问题。

从一个对象移动会使其处于“有效但未指定状态”;所有类不变式都得到维护,操作也按照规定进行。

这意味着您可以依赖于重新分配,但不能保证指针当前内容的任何保证。


那么移动后,旧的 unique_ptr 没有可能仍然链接到旧对象并删除它(因为 operator= 基本上是一个 reset(release)),对吗? - Dean
@Dean 从另一个std::unique_ptr进行移动构造被记录为转移所有权,因此不会发生这种情况。 - TartanLlama
太好了,这回答了我的问题! - Dean

1
我不确定你所担心的问题,但这应该是绝对安全的。 独特指针是唯一的。 因此,一旦您将指针移动到向量中,pt就是一个空指针,您可以自由重新分配。

我担心移动的对象仍然可能与旧对象存在“链接”,并以某种方式删除它。 - Dean

1

这是安全的,由pt拥有的资源不再属于'pt',这要归功于std::move。在我的调试器中,该指针将被设置为特殊的已删除地址。

在您的示例中,给pt一个更紧密的作用域并减少重复的getUniquePtr调用可能会更"安全",但这只是一个非常边缘的风格问题。

while (true) {
  auto pt = getUniquePtr();
  if(pt == nullptr) break;
  vector_of_objects.push_back(std::move(pt));
}

@user2079303 嗯,确实是个严重的打字错误,抱歉。 - Nathan Cooper

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