Когда программа завершает то, что происходит с памятью, выделенной с помощью malloc, которая не свободна?
Скажем, у меня есть следующая программа
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int * i;
if ((i = malloc(sizeof(int) * 100)) == NULL) {
printf("EROOR: unable to allocate memory \n");
return -1;
}
/* memory is allocated successfully */
/* memory is not free'ed but program terminates */
// free(i);
return 0;
}
Вышеупомянутая программа вызывает malloc
для выделения некоторой памяти и не вызывает free
для ее выделения. И программа заканчивается без де-выделения памяти.
Valgrind четко обнаруживает утечку памяти.
<snap>
==14209== HEAP SUMMARY:
==14209== in use at exit: 400 bytes in 1 blocks
==14209== total heap usage: 1 allocs, 0 frees, 400 bytes allocated
==14209==
<sanp>
==14209== LEAK SUMMARY:
==14209== definitely lost: 400 bytes in 1 blocks
==14209== indirectly lost: 0 bytes in 0 blocks
==14209== possibly lost: 0 bytes in 0 blocks
==14209== still reachable: 0 bytes in 0 blocks
==14209== suppressed: 0 bytes in 0 blocks
==14209==
==14209== For counts of detected and suppressed errors, rerun with: -v
==14209== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Вопрос:
Когда программа завершается, что происходит с выделенной памятью, но не free
'd?
Обновление:
Учтите, что этот код выполняется в другой операционной системе - скажем, windows, linux, solarix, macos и т.д. Есть ли разница в поведении этого кода во время его завершения?
Ответы
Ответ 1
Другие ответы говорят вам две важные вещи:
- Да, память восстанавливается ОС, поэтому технически не требуется
free()
.
- Это хорошая практика, чтобы освободить все, что вы malloced в любом случае.
Однако важно сказать, почему это хорошая практика для free()
всего, что вы malloced. На мой взгляд:
- Привычка: Если вы привыкли освобождаться всякий раз, когда вы malloced, вы не будете случайно забывать, когда сегмент памяти не существует на протяжении всей жизни программы.
- Поддержание работоспособности: Если кто-то приходит, чтобы реорганизовать вашу программу, чтобы сегмент памяти больше не использовался на протяжении всей жизни программы, наличие кода очистки в оригинале будет означать, что он очень вероятно, что обновленная версия также включает код очистки. Для меня это самая важная причина.
- Отладка: Если мы ожидаем, что вся память будет очищена правильно, то обнаружение памяти, которая действительно протекает, намного проще.
Ответ 2
O.S. будет освобождать память, не освобождая ее.
Но хорошей практикой является освобождение всей памяти, выделенной malloc
Ответ 3
Память восстанавливается операционной системой после выхода вашей программы.
ОС не понимает, что ваша программа просочилась в память, она просто выделяет память для запуска программы, и как только программа выходит из нее, она восстанавливает эту память.
Однако другие ресурсы, такие как файловые дескрипторы, могут/не могут быть повторно воспроизведены ОС, вызвав утечку ресурса.
Итак, хорошая практика заключается в том, что программа должна очистить весь ресурс, который он использовал до выхода.
Ответ 4
Когда процесс распределяет память динамически, он берет блок (ов) памяти из ОС. Когда процесс не нуждается в выделенной памяти, он свободен (ы). Затем ОС добавляет эти блоки в свой бесплатный список. То же самое происходит, когда процесс завершается. Все блоки, используемые процессом, восстанавливаются ОС.
Прочитайте управление памятью для получения дополнительной информации.
Ответ 5
Что еще более важно, БЕСПЛАТНО обеспечивает разумность выделенной вами памяти/буферов и, следовательно, обеспечивает быструю контрольную точку для сдерживания/улавливания кучи.