[英]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));
}
}
但是,我发现在将指针“ child”推回root->children
之前,该指针变为空。 为什么递归后它会丢失其值? 我在这里做错了什么? 谢谢!
EDIT1:现在我意识到在移动期望值后无法使用unique_ptr来获取期望值,那么如何使用智能指针来实现(生长一棵树)呢?
从对象移开后,它在概念上是空的。 这就是为什么移动比复制更有效的原因,因为您可以窃取随后消失的资源。 从对象移动两次而不给出新值是一个错误。 另外, unique_ptr
具有对象的唯一所有权,因此只能有一个对象,因此您不能将其同时传递给growTree
和root->children
。
为了解决这个问题,您必须决定谁拥有child
。 std::move
孩子std::move
到那里,并在另一个地方保持对该地方的稳定引用。 如果该位置取决于运行时,则可以改用shared_ptr
。
完全正常:
在push_back
之前,您将使用std::move
来移动child
。 从字面上看,这意味着您正在将child
growTree
,您不再想要它。
移动之后, child
不再指向原始对象(因为另一个对象有指向它的指针,所以您最终将其移动了)。
如果要修改child
,则应将其作为参考传递,以便growTree
可以修改Node
child
Node
指向的child
,而该child
Node
不会丢失指向它的指针:
void growTree(std::unique_ptr<Note>& node);
当您将某物移动到其他人时,您将不再拥有原件。 为什么会这样呢?
一旦你移动的unique_ptr到growTree通话,原来的对象现在是一个有效的,但空状态(其它对象常常是有效的,但不确定状态,肯定不是原来的状态, 不应该再使用)。 这是预料之中的,由于尝试再次使用它,您的代码有错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.