← 模式

独占所有权

12345678910111213#include <memory> #include <utility> struct foo {}; void func(std::unique_ptr<foo> obj) { } int main() { std::unique_ptr<foo> obj = std::make_unique<foo>(); func(std::move(obj)); }

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

将一个动态分配对象的所有权唯一地转移给另一段代码。

描述

第 11 行,我们创建了一个 std::unique_ptr,它拥有一个动态分配的 foo 对象的所有权(该对象由 std::make_unique 工具函数创建)。接着,第 12 行 演示了如何将该对象的所有权传递给函数 func。所有权转移后,main 函数将无法再访问这个 foo 对象。

由于 std::unique_ptr 是不可复制的,所以它必须通过移动(move)而非复制(copy)来传递。在 第 12 行std::move 的调用,使得 obj 可以被当作一个临时对象(表达式 std::move(obj) 是一个右值)来处理,从而能够将其移动到函数中。

在其他情况下,您可能希望共享一个对象的所有权

注意std::make_unique 是在 C++14 中引入的。对于 C++11,您可以自己实现一个

贡献者

  • Joseph Mansfield

最后更新

2018年8月27日

来源

在 GitHub 上 Fork 此模式

分享