如何在unique_ptrs之间转移所有权

3

我有两个智能指针:

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++代码?
3个回答

6

使用std::moveu2转换为右值,然后使用移动赋值将u2“移动”到u1中:

u1 = std::move(u2);

移动后,尽管对于“unique_ptr”来说这是一种特殊情况,但“u2”将为“nullptr”,不要指望移动的对象通常会处于任何特定状态。当然,“p1”将被优雅地删除。
我建议您根本不要创建“p1”或“p2”,也永远不要有任何拥有原始指针的所有权:
std::unique_ptr<Foo> u1(new Foo);

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

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

4
您想要做的基本上是描述移动赋值的unique_ptr,除了删除器部分(这里不相关):
u1 = std::move(u2);

3
以下两个版本将完成相同的任务:
u1 = std::move(u2);

并且

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

虽然第一种方法更高效,但无论哪种方法u2都将保存nullptr

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接