Код для malloc
и free
должен поддерживать структуры данных, отслеживая каждый блок памяти, который он вам дал. Давайте представим, что на каждый блок памяти приходится 16-байтовая структура данных, возвращаемая malloc
. Вы сказали, что выделили 119 МБ, что, поскольку вы выделили 1-байтовые блоки, говорит о том, что у вас есть что-то вроде 124780544 блоков. Если каждый блок имеет 16 байтов служебной информации, то это 124780544 x 16 = 1996488704 байта служебной информации. 124780544 + 1996488704 = 2121269248, или примерно 2 ГБ.
(Это не доказывает , что ваша система фактически использует ровно 16 байтов служебной информации для каждого возвращаемого блока - это, вероятно, более сложно, чем это - но результат, безусловно, наводит на размышления. )
Мораль в том, что выделение множества крошечных блоков памяти может быть довольно расточительным.
Если вы измените свою тестовую программу так, чтобы она выделяла блоки, скажем, по 1 Кб за раз, вы, вероятно, получите более приемлемый результат.