我有两个智能指针:
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::move
将u2
转换为右值,然后使用移动赋值将u2
“移动”到u1
中:
u1 = std::move(u2);
std::unique_ptr<Foo> u1(new Foo);
或者更好的办法是,在C++14中:
auto u1 = std::make_unique<Foo>();
unique_ptr
,除了删除器部分(这里不相关):u1 = std::move(u2);
u1 = std::move(u2);
并且
u1.swap(u2);
u2.reset(nullptr);
虽然第一种方法更高效,但无论哪种方法u2
都将保存nullptr
。
我也加入了使用C++14中的std::make_unique
的队伍(更高效,在许多情况下更安全)。