C ++:vector中的shared_ptr没有更新原始的shared_ptr

时间:2016-11-28 21:23:34

标签: c++ vector tree shared-ptr

我正在用c ++做学校作业(我还在学习)。我试图实现随机生成的二叉树结构,使用shared_ptr在多个地方存储节点的信息(我需要用于家庭作业)。请考虑以下示例代码(这是我的小测试程序):

#include <vector>
#include <memory>


struct Node : public std::enable_shared_from_this<Node> {
    char charValue;
    int intValue;
    std::shared_ptr<Node > left;
    std::shared_ptr<Node > right;
    std::shared_ptr<Node > parent;

    std::shared_ptr<Node> getPtr()
    {
        return shared_from_this();
    }

    Node() : intValue(0)
    {
        charValue = 0;
    }
};

int main(int argc, char**argv) {

    std::vector<std::shared_ptr<Node>> treeQueue;
    std::shared_ptr<Node> root = std::make_shared<Node>();

    treeQueue.clear();
    treeQueue.push_back(root->left);  //std::shared_ptr<Node>(root->left)); //root->left->getPtr()); 
    treeQueue.push_back(root->right);  //std::shared_ptr<Node>(root->right)); //root->right->getPtr());

    treeQueue[1] = std::make_shared<Node>(); //std::shared_ptr<Node>(new Node);
    system("PAUSE");

    return 0;
}

在这种情况下,我初始化一个根,我想保持树的每个其他节点为空,直到我在树结构中选择它。在我的作业中,我决定在我将它推入向量treeQueue之后选择哪个节点。 (我从那里随机挑选)。

问题:例如,在上面的代码中,当我初始化treeQueue [1]时,我希望root-&gt; right也被初始化。因为他们是相同的指针。但它保持空洞!我还提出了另外一种方法,我试图在treeQueue中推送它(这也没有用)。我已经尝试过&#34; enable_shared_from_this&#34;也是,这就是它的原因。

有办法做到这一点吗?或者是否有另一种技术可以提供我需要的相同功能?

我了解到使用原始指针并不健康,所以我使用了shared_ptr这是有道理的,但现在我遇到了这个问题。请帮帮我,我会失去理智。我到处搜寻。我尝试了所有我找到的东西。

2 个答案:

答案 0 :(得分:4)

shared_ptr分享ptr指向的内容。 shared_ptr本身不以任何方式,形状,物质或形式“共享”。引用同一对象(正在共享)的每个shared_ptr都是它自己独立的离散共享指针。

在此,您将一个shared_ptr复制到另一个shared_ptr。然后,您将shared_ptr的副本替换为另一个新构建的shared_ptr

新构建的shared_ptr与原始shared_ptr无关,而第一个(从中复制的那个)正在引用。

您的代码等同于以下内容:

int *a=NULL;

int *b=a;

b=new int{4};

您希望现在*a返回4吗?当然不是。它们是两个完全不同的指针。

答案 1 :(得分:0)

感谢Sam Varshavchik让我理解我的错误。我最终也采用了Jarod42的建议并使用了treeQueue作为

std::vector<std::shared_ptr<Node>*>

它有效。所以我将此评论标记为解决方案,作为对这两条评论的引用:)