Адреса и размеры свободных блоков, созданных при операциях Dispose и FreeMem, хранятся в списке свободных блоков, который увеличивается вниз, начиная со старших адресов памяти, в сегменте динамически распределяемой области. Каждый раз перед выделением памяти для динамической переменной, перед тем, как динамически распределяемая область будет расширена, проверяется список свободных блоков. Если имеется блок соответствующего размера, то он используется.
Процедура Release всегда очищает список свободных блоков и программа динамического распределения памяти «забывает» о незанятых блоках, которые могут существовать ниже указателя динамически распределяемой области.
Указатель списка свободных блоков сохраняется в переменной FreeList.
type
PFreeList = ^TFreeRec;
TFreeRec = record
Next : PFreeList;
Size: word;
End;;
FreeListP = ^FreeListM;
var
FreeList:FreeListP;
Степень детализации для программы динамического распределения составляет 1 байт.
При случайном занятии и освобождении большого числа блоков различного размера будет получено большое количество небольших незанятых блоков. Для округления в сторону увеличения размера, определяемого при каждом вызове процедур GetMem и FreeMem можно произвести выравнивание. В общем случае, чем выше выравнивание, тем менее вероятно возникновение неиспользуемых свободных блоков. Для этого можно написать собственные процедуры GetMem и FreeMem, которые будут изменять параметр Size, а затем обращаться к процедурам System.GetMem и System.FreeMem:
procedure MyGetMem(var p:pointer; Size:word);
begin
Size := (Size + 15) shr 4 shl 4;
System.GetMem(p, Size);
end;