unique_ptr移动后变得空
unique_ptr becomes empty after moving
我第一次尝试使用unique_ptr来种植二叉树,它基本上是这样的:
void growTree(unique_ptr<Node> root){
//do some calculations
root->value = "some value"
for(int i=0;i<2;i++){
unique_ptr<Node> child(new Node);
growTree(move(child));
root->children.push_back(move(child));
}
}
但是,我发现指针"孩子"在我将它们推回root->children
之前变为空。为什么它在递归后会失去其值?我在这里做错了什么?谢谢!
编辑1:现在我意识到我不能在移动它后使用unique_ptr来获得预期值,那么我如何使用智能指针来做到这一点(种植一棵树)呢?
这是完全正常的:
在push_back
之前,您正在移动child
与std::move
。从字面上看,这意味着您正在将child
赠送给growTree
,您不再想要它了。
移动后,child
不再指向原始对象(因为另一个对象具有指向它的指针,所以您毕竟移动了它)。
如果要修改child
,则应将其作为引用传递,以便growTree
可以修改Node
child
指向,而不会使child
丢失指向它的指针:
void growTree(std::unique_ptr<Note>& node);
从对象移动后,它在概念上是空的。这就是为什么移动比复制更有效,因为您可以窃取然后消失的资源。从对象移动两次而不给予是新值是一个错误。此外,unique_ptr
对对象具有唯一的所有权,因此只能有一个,因此不能将其同时传递给growTree
和root->children
。
要解决此问题,您必须决定谁拥有child
。 std::move
孩子在那里,并在另一个地方保持对那个地方的稳定引用。如果该地点依赖于运行时,则可以改用shared_ptr
。
当你把东西搬给别人时,你就不再有搬出的东西了。你为什么会期待呢?
将unique_ptr移动到 growTree 调用中后,原始对象现在处于有效但为空的状态(其他对象通常处于有效但未指定的状态,当然不是原始状态,不应再次使用)。这是意料之中的,并且由于尝试再次使用它,您的代码有问题。
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 唯一 ptr 将所有权移动到包含对象的方法
- 独特的PTR和移动语义