Я получаю отказ сегментации после free
луг определенный указатель:
free(studentDB->name);
Я могу получить его значение без любых ошибок или предупреждений:
printf("[DBG] studentDB->name: %s\n", studentDB->name);
Однако как я сказал, катастрофические отказы программы, когда я пытаюсь освободить его. Каковы наиболее распространенные причины для a free
продвижение команды к отказу сегментации?
Если вы не malloc()
его, вы не можете free()
его. Откуда берется studentDB->name
?
Обычно повреждения кучи где-то еще в программе. Куча обычно является непрерывной, и диспетчер кучи окружает блоки кучи заголовками для отслеживания блоков. Если вы перезапишите заголовок блока, доступ к нему будет нормальным, но free
, скорее всего, потерпит неудачу.
Вероятно, вы либо уже освободили его, либо перезаписали информацию malloc, предшествующую блоку, с превышением буфера
Ошибка сегментации из free
может быть вызвана его вызовом по указателю, который не был выделен с помощью malloc
, или уже был свободен
.
Было бы полезно, если бы вы разместили код, в котором было размещено studentDB-> name
.
Также может быть, что обращение к члену name указателя studentDB приводит к сегфаулту, если studentDB равен NULL.
Из manpage:
free( ptr ) освобождает область памяти на который указывает ptr, который должен быть был возвращен предыдущим вызовом malloc(), calloc() или realloc(). В противном случае, или если free(ptr) уже была вызвана ранее, возникает неопределенное поведение произойдет. Если ptr равен NULL, то операция не выполняется.
Можно также проверить:
Была ли studentDB->name
выделена ранее? Если вы не выделяли память для этого поля, то, скорее всего, когда вы вызвали free
, у вас произошел seg-fault! Пожалуйста, проверьте это поле и убедитесь, что оно было malloc
d или strdup
d.
Или что есть повреждение в другом месте на куче, которое совпало с этим, как вы правильно заметили, вы можете увидеть значение name
...
Надеюсь, это поможет, С наилучшими пожеланиями, Том.