我无法理解为什么地图导致分段错误

时间:2011-03-22 09:34:35

标签: c++ map segmentation-fault while-loop

我有一个执行以下操作的循环:

short fooID;
char line[256]
map<short,foo> foos;
set<short> barIDs;
while (fgets(line,256,file) != NULL){
  string line_copy = line;
  /*use token to split the line into several parameters which does not effect foo * bar*/
  string token = strtok(line,",");
  token = strtok(NULL,",");
  token = strtok(NULL,",");
  token = strtok(NULL,",");
  token = strtok(NULL,",");
  barID = short(atoi(token));
  foo * bar;
  bar = new foo;
  if(barIDs.find(barID) == barIDs.end()){
     barIDs.insert(barID);
     bar->setID(barID);
     this->foos[barID] = bar;
  }
}

当我运行此代码时,当从文件加载所有条形时,我会遇到分段错误。 barID范围是1-1192。

有什么想法吗?

由于

上面的代码只是我实际代码的类型总结

4 个答案:

答案 0 :(得分:2)

foo * bar;

这会创建一个指向内存中随机位置的变量bar。你需要指向一个有效的对象:bar = new foo; - 并记住在完成后删除它,迭代你的地图并删除你添加的所有foo

答案 1 :(得分:0)

请注意,char * strtok ( char * str, const char * delimiters )会更改str参数的内容(请参阅C++ Reference on strtok)。也许您应该将line替换为line_copy,因为您将其声明为string line_copy = line;

答案 2 :(得分:0)

好的,我的猜测是你在这里崩溃了:

barID = short(atoi(token));

如果数据文件的最后一行有换行符,则最后fgets读取(在EOF上返回NULL之前)将返回一个空行。你没有检查这种情况。同样,在将strtok传递给atoi之前,您不会检查NULL的结果。在空白行上,结果将为atoi。所以{{1}}会崩溃。

也就是说,您不断更改细节,因此我无法知道所描述的事件序列是否与您的真实代码有关。这不是获得帮助的好方法。我建议你将来提供一个准确的代码片段(可编译是最好的)和崩溃的一些细节(通常不难确定崩溃的位置,至少)。

答案 3 :(得分:0)

你有一个当地的foos:

map<short,foo> foos;

但后来你使用this-&gt; foos存储栏

this->foos[barID] = bar;

此外,地图存储foo,而不是foo *