我有一个执行以下操作的循环:
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。
有什么想法吗?
由于
上面的代码只是我实际代码的类型总结
答案 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 *