Ошибка сегментации после free (), каковы частые причины этого? - PullRequest
7 голосов
/ 22 февраля 2010

Я получаю ошибку сегментации после free использования определенного указателя:

free(studentDB->name);

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

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

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

Ответы [ 7 ]

15 голосов
/ 22 февраля 2010

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

2 голосов
/ 22 февраля 2010

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

2 голосов
/ 22 февраля 2010

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

0 голосов
/ 22 февраля 2010

С manpage:

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

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

  1. Является ли studentDB ненулевым указателем на класс / структуру, содержащую член "name"?
  2. Пространство, на которое указывает studentDB-> name, было возвращено функцией malloc / calloc / realloc?
0 голосов
/ 22 февраля 2010

Возможно также, что доступ к элементу имени указателя studentDB является ошибкой, если studentDB равен NULL.

0 голосов
/ 22 февраля 2010

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

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

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

0 голосов
/ 22 февраля 2010

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

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

...