← 模式
独占所有权
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,您可以自己实现一个。