free () не освобождает память должным образом? - PullRequest
4 голосов
/ 21 февраля 2010

Я пытаюсь освободить память, выделенную для malloc, но команда free, похоже, не выполняет свою работу должным образом в соответствии с отладчиком Eclipse. Как это возможно?

Ниже приведен скриншот моего отладчика после того, как он предположительно освободился seCurrent->student->year, что явно не так. year было выделено с использованием malloc.

альтернативный текст http://img693.imageshack.us/img693/7840/codeo.png

Ответы [ 4 ]

12 голосов
/ 21 февраля 2010

free () обычно не меняет никаких значений в вашей программе - он просто вносит коррективы в кучу времени выполнения C. Это означает, что значения в только что освобожденной памяти сохраняются. Однако попытки доступа к ним из вашего кода приводят к неопределенному поведению.

7 голосов
/ 21 февраля 2010

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

5 голосов
/ 21 февраля 2010

Free вернет выделенное пространство в кучу для повторного использования последующими malloc, но это не изменит значения любых указателей, которые ранее ссылались на эту память.В вашем случае никакие другие malloc не выполнялись, поэтому только что освобожденная память остается такой же, какой была до вызова free.Чтобы ваш код знал, что с указателем больше нет данных, вы можете установить его на null после освобождения памяти, связанной с ним.

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

когда вы malloc() памяти, все, что он делает, - это ищет свободное место в памяти и отслеживает, как оно используется. Это не инициализирует это или что-то еще.

при вызове free() все, что он делает, это очищает этот блок памяти из списка используемых блоков памяти. Снова это не изменяет содержание.

...