По понятным причинам практически никакой распределитель памяти не возвращает блоки в ОС
Память может быть удалена из вашей программы только в единицах страниц, и даже это вряд ли будет наблюдаться.
calloc (3) и malloc (3) взаимодействуют с ядром, чтобы получить память, если это необходимо. Но очень, очень немногие реализации free (3) когда-либо возвращают память ядру 1 , они просто добавляют ее в свободный список, который calloc () и malloc () будут использовать позже, чтобы повторно использовать выпущенную версию. блоки. Есть веские причины для такого подхода к проектированию.
Даже если free () хочет вернуть память в систему, ему потребуется по крайней мере одна непрерывная страница памяти, чтобы ядро действительно защитило регион, поэтому освобождение небольшого блока приведет только к изменению защиты если это был последний небольшой блок на странице.
Теория работы
Таким образом, malloc (3) получает память от ядра, когда это необходимо, в конечном итоге в единицах дискретных кратных страниц. Эти страницы разделены или объединены в соответствии с требованиями программы. Malloc и свободно сотрудничают, чтобы поддерживать каталог. Они объединяют смежные свободные блоки, когда это возможно, для обеспечения больших блоков. Каталог может включать или не включать использование памяти в освобожденных блоках для формирования связанного списка. (Альтернатива - чуть более совместная память и дружественная подкачка, и она включает в себя выделение памяти специально для каталога.) У Malloc и free практически отсутствует возможность принудительного доступа к отдельным блокам, даже когда специальный и дополнительный код отладки компилируется в программа.
1. Тот факт, что очень немногие реализации free () пытаются вернуть память в систему вовсе не из-за ослабления работы разработчиков.
Взаимодействие с ядром намного медленнее, чем простое выполнение библиотечного кода, и выгода будет небольшой. Большинство программ имеют постоянный или увеличивающийся объем памяти, поэтому время, затрачиваемое на анализ кучи в поисках возвратной памяти, будет полностью потрачено впустую. Другие причины включают в себя тот факт, что внутренняя фрагментация делает блоки, выровненные по страницам, маловероятными, и, вероятно, возвращение блока приведет к фрагментации блоков в любую сторону. Наконец, те немногие программы, которые возвращают большие объемы памяти, скорее всего, будут обходить malloc () и в любом случае просто выделять и освобождать страницы.