Отказ сегментации после свободный (), каковы частые причины для этого?

Я получаю отказ сегментации после freeлуг определенный указатель:

free(studentDB->name);

Я могу получить его значение без любых ошибок или предупреждений:

printf("[DBG] studentDB->name: %s\n", studentDB->name);

Однако как я сказал, катастрофические отказы программы, когда я пытаюсь освободить его. Каковы наиболее распространенные причины для a free продвижение команды к отказу сегментации?

8
задан Pieter 21 February 2010 в 21:36
поделиться

7 ответов

Если вы не malloc() его, вы не можете free() его. Откуда берется studentDB->name?

15
ответ дан 5 December 2019 в 08:52
поделиться

Обычно повреждения кучи где-то еще в программе. Куча обычно является непрерывной, и диспетчер кучи окружает блоки кучи заголовками для отслеживания блоков. Если вы перезапишите заголовок блока, доступ к нему будет нормальным, но free , скорее всего, потерпит неудачу.

2
ответ дан 5 December 2019 в 08:52
поделиться

Вероятно, вы либо уже освободили его, либо перезаписали информацию malloc, предшествующую блоку, с превышением буфера

2
ответ дан 5 December 2019 в 08:52
поделиться

Ошибка сегментации из free может быть вызвана его вызовом по указателю, который не был выделен с помощью malloc , или уже был свободен .

Было бы полезно, если бы вы разместили код, в котором было размещено studentDB-> name .

0
ответ дан 5 December 2019 в 08:52
поделиться

Также может быть, что обращение к члену name указателя studentDB приводит к сегфаулту, если studentDB равен NULL.

0
ответ дан 5 December 2019 в 08:52
поделиться

Из manpage:

free( ptr ) освобождает область памяти на который указывает ptr, который должен быть был возвращен предыдущим вызовом malloc(), calloc() или realloc(). В противном случае, или если free(ptr) уже была вызвана ранее, возникает неопределенное поведение произойдет. Если ptr равен NULL, то операция не выполняется.

Можно также проверить:

  1. Является ли studentDB не-NULL указателем на класс/структуру, содержащую член "name"?
  2. Было ли пространство, на которое указывает studentDB->name, возвращено malloc/calloc/realloc?
0
ответ дан 5 December 2019 в 08:52
поделиться

Была ли studentDB->name выделена ранее? Если вы не выделяли память для этого поля, то, скорее всего, когда вы вызвали free, у вас произошел seg-fault! Пожалуйста, проверьте это поле и убедитесь, что оно было mallocd или strdupd.

Или что есть повреждение в другом месте на куче, которое совпало с этим, как вы правильно заметили, вы можете увидеть значение name...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: