Тема освобождения памяти сложнее, чем вы ожидаете.Есть целых статей , посвященных политикам выделения и освобождения.
Обычно большие блоки выделяются с помощью mmap
(файл отображения памяти), который немедленно освобождается с помощью free
. Маленькие порции памяти вырезаны из большой порции кучи, размер которой управляется семейством функций sbrk
.
Освобождение памяти, выделенной из большой кучи, обычно выполняется путем помещения освобожденного фрагмента в список свободных (или аналогичный).Свободный список управляется библиотекой C и не освобождается ядром через sbrk.Процесс держит освобожденный кусок бесконечно.
Иногда непрерывная область памяти в конце кучи находится в свободном списке.В этом случае библиотека C может решить уменьшить размер кучи и вернуть память операционным системам .Это редкий случай, поскольку достаточно иметь небольшой кусок памяти в конце кучи, чтобы этого не произошло.
Проверьте mallopt для Linux, чтобы узнать, как контролировать агрессивность политики выпуска free
.Обратите внимание, что этот вызов не переносим и изменяется от одной операционной системы к другой.Кроме того, malloc_trim(0)
- это непереносимый, только для Linux, способ заставить библиотеку C вернуть всю память, которую она может, обратно в ОС.Скорее всего, ваша операционная система имеет аналогичный непереносимый вызов для тех же целей.
Обычно небольшие и средние фрагменты памяти никогда не возвращаются в операционную систему и хранятся во внутреннем свободном списке длявремя жизни процесса.Следующие вызовы malloc обычно выделяют память из этого свободного списка.
Единственный способ принудительно освободить память - это управлять ею напрямую, полностью избегая malloc / free.Вы можете выделить большой кусок памяти через mmap, а затем разархивировать его, когда закончите.При наличии запаса malloc / free очень трудно убедиться, что выделение (и освобождение) выполняется в LIFO (последний пришел первым вышел), иначе будет небольшой блок памяти, препятствующий освобождению памяти для ОС.
примечание
Детали отличаются в разных операционных системах.Системы Windows и POSIX имеют разные политики и разные примитивы отображения памяти.В ОС без виртуальной памяти, такой как DOS, вся память может быть немедленно возвращена ОС (без mmap и sbrk).