Я не могу понять, почему карта вызывает ошибку сегментации - PullRequest
0 голосов
/ 22 марта 2011

У меня есть цикл, который выполняет следующее:

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 ]

2 голосов
/ 22 марта 2011
foo * bar;

Это создает переменную bar, указывающую на случайное место в памяти. Вам нужно, чтобы он указывал на действительный объект: bar = new foo; - и не забудьте удалить его, когда закончите, переберите свою карту и удалите все foo, которые вы добавили.

0 голосов
/ 22 марта 2011

У вас есть местные foos:

map<short,foo> foos;

Но позже вы используете это-> foos для хранения бара

this->foos[barID] = bar;

Кроме того, на карте хранится foo, а не foo *

0 голосов
/ 22 марта 2011

ОК, я предполагаю, что вы рухнули здесь:

barID = short(atoi(token));

Если в последней строке вашего файла данных есть перевод строки, то последняя прочитанная fgets (перед возвратом NULL в EOF) вернет пустую строку. Вы не проверяете это условие. Точно так же вы не проверяете результат strtok, прежде чем передать его в atoi. И в пустой строке этот результат будет NULL. Так что atoi вылетит.

Тем не менее, вы постоянно меняете детали, поэтому я не могу узнать, имеет ли описанная последовательность событий какое-либо отношение к вашему реальному коду. Это не отличный способ получить помощь. Я бы посоветовал вам в будущем предоставить точный фрагмент кода (лучше всего скомпилировать) и некоторые подробности о сбое (обычно, по крайней мере, не сложно определить место сбоя).

0 голосов
/ 22 марта 2011

Обратите внимание, что char * strtok ( char * str, const char * delimiters ) изменяет содержимое параметра str (см. C ++ Ссылка на strtok ). Возможно, вам следует заменить line на line_copy, поскольку вы объявляете его как string line_copy = line;?

...