В большинстве реализаций распределитель удерживал ранее свободную память, вы не ожидали, что всегда будете иметь непрерывную память.
Подумайте об этом случае: Test1
- большой объект, Test2
маленький, Test3
- средний размер.
Когда вы выделяете для Test1
, текущий пул памяти не имеет достаточно большой многоразовой памяти, поэтому он запрашивает расширение кучи и выделение оттуда. Затем вы делаете для маленького Test2
, это всего лишь крошечный объект, из которого ранее можно было использовать многократно используемую память, поэтому вы получаете Test2
из этого пула.
Для Test3
его аналогично Test2
, но для выполнения аллокатор будет держать несколько бассейн для различного размерного диапазона, так Test3
не может идти после Test2
.
ПРИМЕЧАНИЕ. Все эти требования не являются обязательными в спецификации, это зависит от реализации, и предлагаемая здесь только одна из обычной реализации (дальнейшее чтение: распределение памяти Buddy).