繁体   English   中英

移动后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));
    }
    }

但是,我发现在将指针“ child”推回root->children之前,该指针变为空。 为什么递归后它会丢失其值? 我在这里做错了什么? 谢谢!

EDIT1:现在我意识到在移动期望值后无法使用unique_ptr来获取期望值,那么如何使用智能指针来实现(生长一棵树)呢?

从对象移开后,它在概念上是空的。 这就是为什么移动比复制更有效的原因,因为您可以窃取随后消失的资源。 从对象移动两次而不给出新值是一个错误。 另外, unique_ptr具有对象的唯一所有权,因此只能有一个对象,因此您不能将其同时传递给growTreeroot->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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM