Многим кажется, что когда вы освобождаете память, она мгновенно возвращается в операционную систему и может использоваться другими программами.
Это не правда Операционные системы обычно управляют памятью в страницах 4KiB. malloc
и другие виды управления памятью получают страницы из ОС и управляют ими по своему усмотрению. Вполне вероятно, что страницы операционной системы неfree()
будут возвращаться, если предположить, что ваша программа будет выделять больше памяти позже.
Я не говорю, что free()
никогда не вернет память операционной системе. Это может произойти, особенно если вы освобождаете большие участки памяти. Но нет гарантии.
Важный факт: если вы не освобождаете память, которая вам больше не нужна, дальнейшие malloc гарантированно потребляют еще больше памяти. Но если вы сначала освободитесь, то вместо этого malloc может повторно использовать освобожденную память.
Что это значит на практике? Это означает, что если вы знаете, что вашей программе больше не требуется больше памяти (например, она находится на этапе очистки), освобождение памяти не так важно. Однако, если программа может выделить больше памяти позже, вам следует избегать утечек памяти, особенно тех, которые могут повторяться.
Также см. Этот комментарий для более подробной информации о том, почему освобождение памяти перед завершением плохо.
Комментатор, похоже, не понимает, что вызов free()
не позволяет автоматически другим программам использовать освобожденную память. Но в этом весь смысл этого ответа!
Итак, чтобы убедить людей, я продемонстрирую пример, в котором free () приносит мало пользы. Чтобы упростить математику, я сделаю вид, что ОС управляет памятью в 4000 байтовых страниц.
Предположим, вы выделяете десять тысяч 100-байтовых блоков (для простоты я проигнорирую дополнительную память, которая потребуется для управления этими выделениями). Это занимает 1 МБ или 250 страниц. Если вы затем освободите 9000 из этих блоков наугад, у вас останется всего 1000 блоков - но они разбросаны повсюду. По статистике, около 5 страниц будут пустыми. Каждый из остальных 245 будет иметь по меньшей мере один выделенный блок. Это составляет 980 КБ памяти, которая не может быть восстановлена операционной системой - даже если теперь у вас есть только 100 КБ!
С другой стороны, теперь вы можете malloc () на 9000 блоков больше, не увеличивая объем памяти, который связывает ваша программа.
Даже если техническиfree()
можно вернуть память в ОС, она может этого не делать. Необходимо достичь баланса между быстрой работой и экономией памяти. Кроме того, программа, которая уже выделила много памяти, а затем освободила ее, вероятно, сделает это снова. Веб-сервер должен обрабатывать запрос за запросом после запроса - имеет смысл сохранять некоторую «свободную» память доступной, чтобы вам не приходилось постоянно запрашивать память у ОС.free()