【问题标题】:unique_ptr without move, why is this working?unique_ptr 没有移动,为什么这有效?
【发布时间】:2018-05-28 12:00:56
【问题描述】:

在代码审查期间,我发现一个期望 unique_ptr 的 C++ 函数通过 std::move 传递给 uniqe_ptr,但该函数既没有将 unique_ptr 作为返回值移动,也没有将返回的 unique_ptr 分配回调用者的 unique_ptr,所以我预计这会崩溃。

例子:

   std::unique_ptr<X> fun(std::unique_ptr<X> p) {
     // Do something with the unique_ptr p
     return p;
   }

在其他地方,我发现了以下调用:

void someFunction() {
  auto p = std::make_unique<X>();
  //...
  fun(std::move(p));
  // Do something else
  fun(std::move(p));
  //...
}

所以我想知道这段代码是否正常,或者它执行是否只是运气。

[编辑]:完成示例

【问题讨论】:

  • 你是说p 被移动了两次
  • @JohnZwinck:是的,它实际上移动了两次(我将示例扩展得更清楚)
  • 执行两次std::move(p) 不是问题。第一个std::move 会将unique_ptr 设置为nullptr,因此第二个fun(std::move(p)) 应该将nullptr 传递给您的函数。

标签: c++11 unique-ptr


【解决方案1】:

在这个片段中:

fun(std::move(p));
fun(std::move(p));

p 被移出,使其为空。所以第二次调用fun() 时,它会收到一个空指针。这很好,只要它不取消引用该指针。

【讨论】:

    【解决方案2】:

    在我看来,意图是像这样调用fun

    p = fun(std::move(p));
    p = fun(std::move(p));
    

    在这种情况下,p 的所有权将在函数之间来回传递。我更愿意将 fun 设为 void 函数,并通过引用传递 p 甚至作为原始 X* 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2021-10-16
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多