【发布时间】:2021-08-22 14:56:40
【问题描述】:
编辑将代码更改为最小可重现示例
所以我基本上有一个结构和一个创建该结构实例的函数,将它们推入std::vector<Node>,然后返回它。
#include <iostream>
#include <vector>
struct Node {
int value;
Node *left;
Node *right;
};
Node createNodeFamily(Node child1, Node child2) {
Node parent;
parent.value = child1.value + child2.value;
parent.left = &child1;
parent.right = &child2;
return parent;
}
std::vector<Node> f(std::vector<Node>& nodes) {
std::vector<Node> l;
Node parent = createNodeFamily(nodes[0], nodes[1]);
l.push_back(parent);
Node r = l[0];
std::cout << "correct value of left child node: " << r.left->value << std::endl;
std::cout << "correct value of right child node: " << r.right->value << std::endl;
return l;
}
int main() {
Node child1;
child1.value = 2;
Node child2;
child2.value = 1;
std::vector<Node> children;
children.push_back(child1);
children.push_back(child2);
std::vector<Node> p = f(children);
Node parent = p[0];
//std::cout << parent.value << std::endl;
std::cout << "wrong value of left child node: " << parent.left->value << std::endl;
std::cout << "wrong value of right child node: " << parent.right->value << std::endl;
return 0;
}
在我的例子中的输出:
Printed inside the function:
>> correct value of left child node: 2
>> correct value of right child node: 1
Printed outside the function:
>> wrong value of left child node: 1875944288
>> wrong value of right child node: 16717313
所以该结构有两个属性left 和right,它们是指向子节点地址的指针。当我读取那些在testFunction 中打印它们的指针的值时,它们是正确的。
但是当我返回它们并打印它们时,它们看起来像是随机数。
【问题讨论】:
-
向量中的节点是否指向向量中的其他节点?如果是这样,您将需要重新考虑您的设计。每次在向量上调用
push_back时,它都会使向量中所有元素的所有引用、指针和迭代器失效,这会破坏节点链接。 -
...如果这是唯一的问题,您或许可以改用
std::list来克服它。 -
我不认为这是问题所在,因为我在检查函数内部/返回之前,向量的内容是正确的)。我认为问题在于,当函数停止时,指针的值指向停止存在,因此在读取它们时会给出随机结果@NathanOliver
-
我认为
std::vector<Node> textFunction(std::vector<Node> nodes)是你的问题。您构建指向nodes的节点,但nodes是按值传递的,因此当函数结束时,它内部的所有内容都会消失。如果您使用std::vector<Node> textFunction(std::vector<Node>& nodes)可能会解决您的问题。 -
存储您使用
&获取的指针以供以后使用很少是一个好主意。当函数返回时,createNodeFamily的两个参数都会被销毁。