Почему STL отображает дамп ядра при поиске? - PullRequest
4 голосов
/ 26 января 2009

Итак, у меня есть такая ситуация, когда мне нужно посмотреть, есть ли объект на моей карте stl. Если это не так, я собираюсь добавить его.

char symbolName[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
map<string,TheObject> theMap;
if (theMap.find(symbolName)==theMap.end()) {
            TheObject theObject(symbolName);
            theMap.insert(pair<string, TheObject>(symbolName,
                    theObject));
}

Я получаю дамп ядра на: theMap.find, когда объекта еще нет на карте. Предположительно, если элемент отсутствует на карте, он должен вернуть итератор, эквивалентный map :: end

Что здесь происходит?

GCC: 3.4.6

Ответы [ 10 ]

4 голосов
/ 26 января 2009

Может произойти сбой по многим причинам. Не зная определения, по крайней мере, конструкторов TheObject, я думаю, что нам остается только догадываться о проблеме. Пока что ваш код выглядит нормально, но его можно упростить:

char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));

Он ничего не сделает, если символ уже сопоставлен, отбрасывая новый объект TheObject.

4 голосов
/ 26 января 2009

Почему бы просто не сделать это таким образом?

char symbolName[] = "hello";
theMap.insert(pair<string, TheObject>(symbolName, TheObject(symbolName)));

Если ваша карта map<string, TheObject>, вы получите дамп ядра, если попытаетесь найти NULL:

// This will core dump:
char *symbolName = NULL; // Oops!
theMap.find(symbolName); // Kabang!
2 голосов
/ 26 января 2009

Опубликуйте свой реальный код или хотя бы полный пример, демонстрирующий поведение, которое вы описываете. Иногда проблема заключается в тонкости, теряемой при переводе, когда вы пытаетесь отладить вымышленный код, написанный просто для публикации на форумах, подобных этому.

2 голосов
/ 26 января 2009

Кстати, есть два возможных упрощения.

Во-первых, используйте make_pair вместо использования конструктора pair. Это означает, что вам не нужно явно указывать аргументы типа:

theMap.insert(make_pair(symbolName, theObject));

Во-вторых, вместо вашего кода вы можете просто написать:

theMap[symbolName] = theObject;
2 голосов
/ 26 января 2009

Проверьте, является ли ваша карта STL пустой (), прежде чем выполнять поиск (). Некоторые реализации STL содержат ошибки при выполнении find () на пустой карте STL.

1 голос
/ 27 января 2009

Как дополнение к упрощению кода:

Используйте std :: string вместо char [] и используйте его внутри определения класса для TheObject.

Не уверен, что делает ваш класс TheObject с массивом char, но если вы используете карту вне области действия этой функции, например. используя его в качестве возвращаемого значения, могу поспорить, что где-то есть объект, указывающий на адрес symbolName, который больше не определяется.

1 голос
/ 26 января 2009

Этот код должен работать нормально.

Единственная возможная проблема - внутри реализации TheObject, но она не должна влиять на вызов find.

Кроме того, могут возникать некоторые не связанные с этим проблемы, например Переполнение буфера из-за некоторого кода, выполняемого перед ним.

0 голосов
/ 07 мая 2009

Я исправил эту проблему, используя указатели на объекты карты. Так как они использовались в конструкторе, они должны быть указателями, а затем внутри конструктора я их обновил.

0 голосов
/ 07 мая 2009

Проверьте, используете ли вы его в конструкторе. У меня была похожая проблема при использовании карты внутри конструктора.

0 голосов
/ 26 января 2009

Я не знаю, почему вы получаете дамп ядра; у меня код работает.

Существуют возможности сделать ваш код более простым и читабельным:

  • Как заметил кто-то еще, вы можете упростить вставку до theMap[symbolName] = TheObject(symbolName)

  • Я могу ошибаться, но, насколько я знаю, {'a', 'b', '\ 0'} совпадает с "abc", так что вы можете упростить до char symbolName[] = "Hello"; Такое впечатление, что не-идиоматическое определение сбивает с толку некоторых людей здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...