如何在unique_ptrs之间移动所有权

时间:2014-09-25 17:57:28

标签: c++ c++11

我有两个智能指针:

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

现在我希望u1拥有p2。我希望u2不拥有任何东西(或nullptr)。对于cource,同时必须优雅地删除p1

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

3 个答案:

答案 0 :(得分:6)

使用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>();

答案 1 :(得分:4)

你想要做的基本上是unique_ptr的移动分配的描述,模拟删除部分(这里不相关):

u1 = std::move(u2);

答案 2 :(得分:3)

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

u1 = std::move(u2);

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

虽然第一个更有效率。 <{1}}在两种情况下都会u2

我也加入了在C ++ 14中使用nullptr的合唱(效率更高,在许多情况下更安全)。