我有两个智能指针:
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 ++代码来完成它?
答案 0 :(得分:6)
使用std::move
将u2
投射到右值,然后使用移动分配将u2
“移动到u1
:
u1 = std::move(u2);
移动后,u2
将为nullptr
,尽管这是unique_ptr
的特殊情况,但不要指望从对象移动到一般的任何特定状态。当然p1
将被优雅地删除。
我建议您根本不创建p1
或p2
,也不要拥有任何拥有原始指针:
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
的合唱(效率更高,在许多情况下更安全)。