如何在unique_ptrs之间移动所有权

How to move ownership across unique_ptrs

本文关键字:之间 移动 所有权 ptrs unique      更新时间:2023-10-16

我有两个智能指针:

Foo *p1 = new Foo;
Foo *p2 = new Foo;
std::unique_ptr<Foo> u1(p1);
std::unique_ptr<Foo> u2(p2);

现在我希望u1拥有p2。我希望u2什么都不拥有(或nullptr)。当然,同时必须优雅地删除p1

我应该写什么C++代码来完成它?

使用std::moveu2强制转换为右值,然后使用移动赋值将u2"移动"到u1:

u1 = std::move(u2);

移动后,u2将是nullptr,尽管这是unique_ptr的特殊情况,一般不要期望从对象移动到任何特定状态。当然,p1将被优雅地删除。

我建议您不要创建p1p2,也不要拥有任何原始指针:

std::unique_ptr<Foo> u1(new Foo);

或者更好的是,在C++14中:

auto u1 = std::make_unique<Foo>();

您想要做的基本上是对unique_ptr的移动分配的描述,对deleter部分进行模运算(此处不相关):

u1 = std::move(u2);

下面的两个版本将执行相同的操作:

u1 = std::move(u2);

u1.swap(u2);
u2.reset(nullptr);

尽管第一种更有效。在这两种情况下,CCD_ 17将保持CCD_。

我也加入了在C++14中使用std::make_unique的行列(更高效,在许多情况下更安全)。