Разрешает ли 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.
Насколько мне известно, большинство крупных ОС фактически освобождают всю выделенную память после завершения программы. Исключением могут быть встроенные ОС, однако у меня пока нет твердого материала, чтобы подтвердить это.
Редактировать: еще один поток, который обсуждает ту же проблему - динамически выделяемая память после завершения программы