Подтвердить что ты не робот

Когда программа завершает то, что происходит с памятью, выделенной с помощью 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 и т.д. Есть ли разница в поведении этого кода во время его завершения?

4b9b3361

Ответ 1

Другие ответы говорят вам две важные вещи:

  • Да, память восстанавливается ОС, поэтому технически не требуется free().
  • Это хорошая практика, чтобы освободить все, что вы malloced в любом случае.

Однако важно сказать, почему это хорошая практика для free() всего, что вы malloced. На мой взгляд:

  • Привычка: Если вы привыкли освобождаться всякий раз, когда вы malloced, вы не будете случайно забывать, когда сегмент памяти не существует на протяжении всей жизни программы.
  • Поддержание работоспособности: Если кто-то приходит, чтобы реорганизовать вашу программу, чтобы сегмент памяти больше не использовался на протяжении всей жизни программы, наличие кода очистки в оригинале будет означать, что он очень вероятно, что обновленная версия также включает код очистки. Для меня это самая важная причина.
  • Отладка: Если мы ожидаем, что вся память будет очищена правильно, то обнаружение памяти, которая действительно протекает, намного проще.

Ответ 2

O.S. будет освобождать память, не освобождая ее.

Но хорошей практикой является освобождение всей памяти, выделенной malloc

Ответ 3

Память восстанавливается операционной системой после выхода вашей программы.
ОС не понимает, что ваша программа просочилась в память, она просто выделяет память для запуска программы, и как только программа выходит из нее, она восстанавливает эту память.

Однако другие ресурсы, такие как файловые дескрипторы, могут/не могут быть повторно воспроизведены ОС, вызвав утечку ресурса.

Итак, хорошая практика заключается в том, что программа должна очистить весь ресурс, который он использовал до выхода.

Ответ 4

Когда процесс распределяет память динамически, он берет блок (ов) памяти из ОС. Когда процесс не нуждается в выделенной памяти, он свободен (ы). Затем ОС добавляет эти блоки в свой бесплатный список. То же самое происходит, когда процесс завершается. Все блоки, используемые процессом, восстанавливаются ОС.

Прочитайте управление памятью для получения дополнительной информации.

Ответ 5

Что еще более важно, БЕСПЛАТНО обеспечивает разумность выделенной вами памяти/буферов и, следовательно, обеспечивает быструю контрольную точку для сдерживания/улавливания кучи.