У меня есть станд.:: карта <станд.:: строка, станд.:: строка>, который инициализировал с некоторым вызовом API. Когда я пытаюсь использовать эту карту, я получаю отказ сегментации. Как я могу обнаружить недопустимый код или что недопустимо или какая-либо деталь, которая может помочь мне решить проблему? Код похож на это:
std::map< std::string, std::string> cont;
some_func( cont ); // getting parameter by reference and initialize it, someone corrupted memory (cont) inside this function
std::cout << cont[ "some_key" ] << '\n'; // segmentation fault here, cannot access "some_key"
В общем, я не уверен, как эта строка могла генерировать ошибку сегмента: оператор скобок всегда будет возвращать std :: string (создавая пустую строку, если необходимо), и она всегда должна быть допустимой для печати.
Возможно ли, что вместо этого стек вызовов, который вы видите, указывает на следующую строку для выполнения и умирает в some_func? Мы не видим его кода, поэтому я не могу сказать, может ли он быть причиной проблемы.
В качестве альтернативы some_func
использует char * (вызывает temp std :: string) для инициализации строк на карте? Возможно, это могло быть введение недопустимой строки в карту, которая какое-то время «работает», но когда some_func возвращает, она плохо взаимодействует с печатью.
В дополнение к valgrind вы можете попробовать использовать отладчик, чтобы сосредоточиться на вашей проблеме.
Установите точку останова в строке some_func (cont)
и проверьте, является ли cont
допустимой ссылкой.
Кроме того, учли ли вы, что cont ["some_key"]
возвращает, если some_key отсутствует?
вы запускаете приложение (скомпилированное в режиме отладки) с синтаксисом:
valgrind yourapp
Valgrind покажет вам обратную трассировку стека того, где произошла ошибка сегментации. После этого вам предстоит выяснить, что произошло, и исправить это.
В вашем коде, независимо от valgrind, я бы проверил, что возвращает cont ["some_key"]
. Наиболее вероятной причиной вашего segfault является то, что возвращаемое значение является неким диким указателем или вообще не инициализировано. Если это так, то любая попытка получить к нему доступ, например cont ["some_key"] [0]
, также вызовет ошибку сегментации.
Еще одна идея: как насчет строковых ключей на вашей карте? Возможно ли, что некоторые из них молча (без исключения) не смогли выделить часть данных строки, используемую в качестве ключа. Std :: map - это не хеш-таблица, а просто упорядоченный контейнер. При поиске ключа может потребоваться доступ к другим ключам, и там может произойти всякое дерьмо. Чтобы проверить, что вы можете попытаться выполнить итерацию по всем ключам на вашей карте и показать контент (чтобы увидеть, возникает ли проблема конкретно с "some_key" или вы не можете получить доступ ни к чему на карте.
Вы также можете попробовать с unordered_map, если ваша программа не требует упорядочивания, чтобы увидеть, является ли поведение таким же.