C — явное восстановление памяти

#c #memory-management #dynamic

#c #управление памятью #динамический

Вопрос:

У меня есть несколько структур данных (деревья, очереди, списки), созданных с использованием процедур динамического выделения (malloc, calloc). При некоторых критических условиях программа должна завершиться. Обход всех объектов для освобождения их памяти занимает много времени.

Безопасно ли избегать обхода всех структур данных непосредственно перед остановкой программы? Если да, применимо ли это ко всем операционным системам и средам (например, нескольким потокам)?

Комментарии:

1. Технически говоря, free() использование или отсутствие памяти не имеет никакого значения для ОС и других программ, поэтому вы free() вообще не могли.

2. Мне любопытно, не является ли хорошей практикой освобождение всей памяти, которую вы динамически выделяете? Кроме того, если вы не освободите выделенную вами память, это может привести к утечкам памяти?

Ответ №1:

Вся память, динамически выделяемая процессом, освобождается обратно в ОС при завершении процесса, не имеет значения, намеренно или из-за сбоя. То же самое происходит с файлами и сокетами — количество ссылок внутри ядра уменьшается, а ресурсы освобождаются, если ссылок больше нет.

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

Ответ №2:

Когда программа (т. Е. процесс) завершается, вся локальная память и память кучи автоматически освобождаются. Обратите внимание, что эти области памяти специфичны для процесса. Таким образом, вы можете пропустить перемещение и освобождение непосредственно перед завершением программы. Однако, если программа использует общую / глобальную память, вам необходимо явно восстановить ее. Наконец, это относится, по крайней мере, к Linux / Unix и Windows. Я считаю, что это применимо ко всем современным операционным системам.

Ответ №3:

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

Ответ №4:

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