gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:48:09 26 4
gpt4 key购买 nike

我正在用 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;
}

在这种情况下,我初始化了一个根,并且我想让树的所有其他节点都为空,直到我在树结构中选择它为止。在我的作业中,我决定在将节点推送到 vector 树队列后选择哪个节点。 (我从那里随机挑选的)。

问题:例如,在上面的代码中,当我初始化 treeQueue[1] 时,我希望 root->right 也被初始化。因为它们是相同的指针。但它仍然是空的!我还将尝试将其推送到 treeQueue 中的替代方法(也没有用)。我也尝试过“enable_shared_from_this”,这就是它存在的原因。

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

我知道使用原始指针是不健康的,所以我使用了 shared_ptr 这很有意义,但现在我遇到了这个问题。请帮助我,我会失去理智。我到处搜索。我尝试了我发现的一切。

最佳答案

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?当然不是。它们是两个完全不同的指针。

关于C++:vector 中的 shared_ptr 没有更新原始的 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40853758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com