Совет Майкла здравый - если вы выходите, вам не нужно беспокоиться об освобождении памяти, так как система все равно восстановит ее.
Единственное исключение - сегменты разделяемой памяти - по крайней мере, в разделе System V Shared Memory. Эти сегменты могут сохраняться дольше, чем программа, которая их создает.
Одна из опций, не упомянутых до сих пор, заключается в использовании схемы выделения памяти на основе арены, построенной на основе стандарта malloc()
. Если все приложение использует одну арену, ваш код очистки может освободить эту арену, и все сразу освобождается. (APR - Apache Portable Runtime - предоставляет функцию пулов, которая, на мой взгляд, похожа; «Интерфейсы и реализации C» Дэвида Хэнсона предоставляют систему выделения памяти на основе арены; я написал такую, которую вы могли бы использовать, если хотите.) можно думать об этом как о "сборке мусора для бедных".
Как общая дисциплина памяти, каждый раз, когда вы выделяете память динамически, вы должны понимать, какой код собирается освободить ее и когда она может быть освобождена. Есть несколько стандартных шаблонов. Самое простое - «размещается в этой функции; освобождается до возврата этой функции». Это сохраняет память в значительной степени под контролем (если вы не выполняете слишком много итераций в цикле, который содержит выделение памяти), и ограничивает ее, чтобы она могла быть доступна для текущей функции и функций, которые она вызывает. Очевидно, вы должны быть разумно уверены, что вызываемые вами функции не будут сжимать (кэшировать) указатели на данные и пытаться использовать их позже после того, как вы освободили и повторно использовали память.
Примером следующего стандартного шаблона являются fopen()
и fclose()
; есть функция, которая выделяет указатель на некоторую память, которая может быть использована вызывающим кодом и затем освобождена, когда программа закончит с ней. Однако это часто становится очень похоже на первый случай - обычно хорошей идеей является вызов fclose()
в функции, которая также вызывала fopen()
.
Большинство оставшихся «шаблонов» несколько ad hoc .