malloc - это функция управления памятью, предоставляемая стандартной библиотекой C. Когда ваша программа вызывает malloc, она не выделяет память напрямую из операционной системы. Реализации Malloc обычно имеют пул памяти, который они разделяют на блоки для удовлетворения запросов на выделение. Когда вы звоните бесплатно, вы только отдаете свой блок памяти обратно в этот пул памяти.
Повторные вызовы malloc в конечном итоге выделяют всю память из пула памяти, управляемого стандартной библиотекой. На этом этапе необходимо выполнить системный вызов, чтобы получить больше памяти от операционной системы. В Linux это системный вызов brk, без сомнения, в Windows будет нечто подобное.
Диспетчер задач в Windows или top в Linux сообщит об объеме памяти, выделенной операционной системе для вашего процесса. Обычно это больше, чем объем памяти, выделенный вашей программе через malloc.
Если вы отслеживаете программу в linux, вы можете видеть, как выполняются эти вызовы malloc и brk
ltrace -S <some program>
malloc(65536 <unfinished ...>
SYS_brk(NULL) = 0x2584000
SYS_brk(0x25b5000) = 0x25b5000
SYS_brk(NULL) = 0x25b5000
<... malloc resumed> ) = 0x2584010
В этом примере мы пытаемся выполнить malloc (65536), но системе malloc не хватает свободной памяти для удовлетворения этого запроса. Поэтому он вызывает системный вызов brk (), чтобы получить больше памяти от операционной системы. После завершения этого вызова он может возобновить вызов malloc и предоставить программе запрошенную память.