Разрешает ли ISO C выделенную память зависать после завершения программы?

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

#include <stdio.h>
#include <stdlib.h>
int main (void) {
    char *mem = malloc (1000);
    if (mem != NULL) {
        // do something with mem
    }
    // memory not freed
    return 0;
}

Они утверждали, что память будет очищена после завершения процесса.

Теперь, будучи местным стандартом Uber-Geek, они обратились ко мне за разъяснениями, и, к моему удивлению, кажется, что всегда свободная толпа действительно может быть правильной.

Обращаясь к С11, 5.1.2.2.3 Program terminationпросто говорится, что достижение конца main идентично звонить exit,

7.22.4.4 The exit function перечисляет те вещи, которые очищены, а именно:

  • позвони всем atexit обработчики.
  • все открытые потоки с неписанным буфером сбрасываются.
  • все открытые потоки закрыты.
  • все файлы, созданные tmpfile закрыты.
  • контроль возвращается в окружающую среду.

Там не упоминается об очистке выделенной памяти.

Сейчас смотрю на 6.2.4 Storage duration of objectsв нем упоминаются четыре периода хранения, из которых "выделенный" является здесь интересным. Далее говорится, что:

Выделенное хранилище описано в 7.22.3.

7.22.3 Memory management functions диктовать поведение всех наших любимых как malloc а также free, Ни в коем случае не упоминается, что происходит с памятью, которая не была освобождена до завершения процесса. Это просто заявляет:

Время жизни выделенного объекта простирается от выделения до освобождения.

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

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

Итак, вот вопрос. Возможно ли (в соответствии с ISO C), что выделенная память может продолжать потреблять ресурсы даже после того, как процесс, который выделил ее, ушел?

Или я что-то пропустил в стандарте, что делает этот спор?

1 ответ

Решение

Очистка выделенной памяти после завершения программы подпадает под компетенцию ОС, а не стандарта C.

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

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

Другие вопросы по тегам