Я написал простую C программу с двумя структурами данных, реализованными как ADT, поэтому я динамически распределяю память для них
Все работало нормально, пока я не решил добавить int значение внутри структуры, ничего динамически не распределяется, classi c обычный старый простой stati c выделение памяти, но с тех пор, как я его добавил, у меня начался segfault в довольно безопасной функции, которая вообще не должна быть segfault.
Я думал об ошибке выделения памяти, поэтому я пытался не освобождать и повторно использовать переменную-указатель, которую я использовал, а вместо этого использовать другую переменную, и программа работала нормально. Разозленный тем, что мне приходилось сталкиваться с подобными ошибками, я снова включил бесплатное, о котором говорил ранее, перекомпилировал и пробежал с valgrind.
К моему удивлению, было абсолютно нет утечки памяти, нет ошибки сегментации, нет каких-либо прерываний, просто предупреждение о Conditional jump or move depends on uninitialised value(s)
, но это требуемое поведение (if (pointer == NULL) { }
), поэтому я запустил исполняемый файл непосредственно из командной строки, и снова все прошло нормально, поэтому ситуация такова:
Программа без нового значения int в структуре:
- Компиляция: проверка
- Выполнения: проверка
- Valgrind анализ: утечки памяти нет, только предупреждение
- Debug (gdb): check
Программа с новым значением int в структуре:
- Compile : check
- Запускается: check
- Анализ Valgrind: нет утечки памяти, только предупреждение
- Отладка (GDB): Segfault
Итак, я думаю, что это противоположность Heisenbug, ошибка, которая показывает себя только и абсолют только при отладке, как я могу это исправить?