我是C ++语言的新手,我正在尝试编写一个遍历树的递归方法。我有一个遍历方法,但有一行代码导致分段错误。我通过注释和取消注释行,编译和执行来测试它。我已经研究了为什么会出现分段错误,并且不明白为什么我正在做的任何事情都会导致内存问题。有人能给我一些关于我做错的建议吗?
map<int, Node> theNodes;
void initialize()
{
// first we read the data
while (inStream.hasNext())
{
string nextLine = inStream.nextLine();
Node newNode = Node(nextLine);
this->theNodes[newNode.getSequence()] = newNode;
}
}
getDownLinks()和 getSequence
的代码vector<int> downLinks;
int sequence;
vector<int> Node::getDownLinks() const
{
return this->downLinks; //
}
int Node::getSequence() const
{
return this->sequence;
}
遍历类代码
int totalPayoff;
Node headNode;
int Traversal::traverse()
{
Node headNode = theNodes[0];
std::vector<int> downLinks = headNode.getDownLinks();
for(int i = 0; i < downLinks.size(); i++)
{
int a = 0;
Node currentNode = theNodes[downLinks[i]];
traverseInner(a, currentNode);
}
return this->totalPayoff;
}
这是traverseInner函数
int Traversal::traverseInner(int& level, Node& node)
{
std::vector<int> nodeDownLinks = node.getDownLinks();
if(nodeDownLinks.size() == 0)
{
totalPayoff = totalPayoff + node.getPayoff();
return 0;
}
for(int i = 0; i < nodeDownLinks.size(); i++)
{
int a = 0;
Node currentNode = theNodes[nodeDownLinks[i]]; <-- This causes segmentation error.
traverseInner(a, currentNode);
}
return totalPayoff;
}
此处未声明的任何变量都在头文件中声明。代码编译得很好。
我还想提一下,我已经用很多不同的方式编写了这段代码,通过我的观察得出结论,任何试图在嵌套语句的大括号中访问的变量都无法被访问通过记忆。甚至是在问题陈述之上声明的 int a 变量,甚至是应该存在的硬编码数据,例如 nodeDownLinks 。如果我尝试通过标准输出打印出一个嵌套语句中的向量大小,我也会得到分段错误。
答案 0 :(得分:1)
可能是&node; nodeDownLinks [i]&#34;它没有初始化,有一个内存随机值,那么你试图访问该位置 &#34; theNodes&#34;数组并给你分段错误。
请确保&#34; nodeDownLinks&#34;已初始化。
答案 1 :(得分:0)
99%因为theNodes
的尺寸较小而崩溃,然后nodeDownLinks[i]
包含索引。所以nodeDownLinks [i]包含错误的索引,你最好检查它并以这种方式打印出错:
int a = 0;
int link = nodeDownLinks[i];
if (theNodes.size() <= link)
std::err << "Wrong link " << link << " in Node" << std::endl;
else
traverseInner(a, theNodes[link]);
它不应该崩溃,你可以在nodeDownLink
轻松找到错误的索引!