首页 >后端开发 >C++ >为什么将`unique_ptr`推入`vector`需要`std::move`?

为什么将`unique_ptr`推入`vector`需要`std::move`?

DDD
DDD原创
2025-01-04 19:28:44717浏览

Why does pushing a `unique_ptr` into a `vector` require `std::move`?

理解错误

考虑以下程序:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  int x(1);
  std::unique_ptr<int> ptr2x(&x);
  vec.push_back(ptr2x); // Error occurs here
}

这段看似无害的代码尝试推送 unique_ptr变成一个向量。但是,编译失败并出现错误:

error: deleted function 'std::unique_ptr<int>::unique_ptr(const std::unique_ptr<int>&)'

unique_ptr 的本质

unique_ptr 是 C 标准库的基本部分,用于管理动态分配对象的生命周期。它确保它封装的指针不能被复制。这意味着托管对象的所有权是 unique_ptr 容器独占的。

问题

出现错误是因为程序尝试将 unique_ptr 的副本推送到向量。然而,如前所述,unique_ptrs 不能被复制。相反,它们只能被移动。

解决方案

因此,要解决这个问题,我们需要使用 std::move 函数来转移 unique_ptr 的所有权从原始变量到向量。更正后的代码应如下所示:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  int x(1);
  std::unique_ptr<int> ptr2x(&x);
  vec.push_back(std::move(ptr2x)); // Use std::move to transfer ownership
}

现在,编译器将能够成功编译并执行程序,不会出现任何错误。

其他注意事项

需要注意的是,代码中unique_ptr的使用是不正确的。 unique_ptr 旨在管理动态分配的对象。代码中的指针指向一个局部变量,该变量将在函数返回时被销毁。要解决此问题,代码应动态分配对象:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  std::unique_ptr<int> ptr(new int(1)); // Dynamically allocate the object
  vec.push_back(std::move(ptr));
}

或者,您可以使用 std::make_unique 函数创建 unique_ptr 并在一行中分配对象:

#include <memory>
#include <vector>

int main() {
  std::vector<std::unique_ptr<int>> vec;

  vec.push_back(std::make_unique<int>(1));
}

以上是为什么将`unique_ptr`推入`vector`需要`std::move`?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn