分段错误C ++

时间:2015-03-05 01:01:38

标签: c++

我是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 。如果我尝试通过标准输出打印出一个嵌套语句中的向量大小,我也会得到分段错误。

2 个答案:

答案 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轻松找到错误的索引!