理解错误
考虑以下程序:
#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中文网其他相关文章!