如何在unique_ptrs之间移动所有权
How to move ownership across unique_ptrs
我有两个智能指针:
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);
移动后,u2
将是nullptr
,尽管这是unique_ptr
的特殊情况,一般不要期望从对象移动到任何特定状态。当然,p1
将被优雅地删除。
我建议您不要创建p1
或p2
,也不要拥有任何原始指针:
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
的行列(更高效,在许多情况下更安全)。
相关文章:
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 在 b2World 之间移动 b2Body
- 在'string=string+s1'和"string+=s1"之间移动语义可以保存多少个复制操作?
- C++11 在列表到映射(或其他容器)之间移动元素
- 使用无锁指针队列在线程之间移动数据是否安全
- 在 3 点之间移动模型会导致模型偏离位置
- 在集合之间移动“ unique_ptr”
- 在线程之间移动向量
- 在变量之间移动队列而不复制元素
- 在标高/房间之间移动角色
- 在 Xcode 和 Visual Studio 之间移动时出现问题
- 如何在unique_ptrs之间移动所有权
- 在进程之间移动STL对象
- 如何设置在运行时创建的Windows控件之间移动的顺序
- 在vector中的vector之间移动指针会导致vector迭代器不兼容
- 在容器之间移动std::unique_ptr
- 在MVP层之间移动数据的众所周知的方法是什么?
- OpenCV错误:在矢量之间移动数据时断言失败
- 在缓冲区之间移动字节时出现意外结果
- 在基类之间移动语义