Стандарт C не имеет понятия о системной среде вне выполнения одной программы, поэтому он не может указать, что происходит "после выхода из программы".В то же время нигде не требуется, чтобы память, полученная с помощью malloc
, была или должна быть освобождена с помощью free
до вызова exit
или возврата из main
, и я думаю, что вполне очевидно, чтоНамерение состоит в том, что выход без освобождения памяти вручную не оставит ресурсы связанными - очень похоже на то, как вызов exit
без закрытия всех файлов, сначала автоматически закрывает их (включая их сброс).
Теперь, что касается должен или не должен вызывать free
, что во многом зависит от вашей конкретной программы.
- Любой код библиотеки должен
free
любая память, полученная исключительно для внутреннего использования, как можно скорее. - Библиотека, которая возвращает выделенные объекты вызывающей программе, должна всегда обеспечивать соответствующий вызов для освобождения этих объектов.
- Библиотека, котораявыполняет любые распределения как часть глобальной инициализации (примечание: это очень плохой дизайн, но иногда неизбежный) должен обеспечитьДля приложения есть способ отменить эту инициализацию и освободить все, что было выделено.Это особенно важно, если библиотека может быть загружена динамически (даже в результате удовлетворения зависимостей другой динамически загружаемой библиотеки).
До сих пор я говорил только о коде библиотеки.На этом этапе все, что осталось, - это выделения, сделанные самим приложением или от имени приложения библиотеками.Мое мнение, и я признаю, что это неортодоксально, заключается в том, что освобождение таких объектов не просто не нужно, но и вредно.Основная причина, по которой я это говорю, заключается в том, что большинство долгоживущих приложений накопили довольно много выделенной памяти, которую они не используют в значительной степени (вспомните о буфере отмены в текстовом процессоре или истории в браузере).В умеренно загруженной системе большая часть этих данных была перенесена на диск к моменту завершения приложения.Если вы хотите освободить его, вы в конечном итоге обойдете все замененные адреса памяти, отслеживая все указатели, чтобы освободить,
- , что приведет к бесполезному износу физических компонентов жесткого диска.
- заставляет пользователя ждать завершения работы вашего приложения
- , что приводит к замене данных других все еще используемых приложений, заставляя их работать медленнее
Всеоб этом во имя смешного правила «вы должны освободить все, что вы выделяете».
Для краткосрочных приложений это не так уж сложно, но вы часто можете упростить реализацию краткосрочных приложений.приложения, которые выполняют одну линейную задачу и завершают работу, если вы не удосуживаете освободить всю память, которую они выделяют.Подумайте о большинстве утилит командной строки Unix.Есть ли смысл писать циклы для sed
, чтобы освободить все скомпилированные регулярные выражения перед выходом?Неужели время программистов не может быть потрачено на что-то более продуктивное?