Обе эти функции анализируют количество свободной памяти, как еще не использованной, так и получившейся в результате освобождения динамических переменных процедурами Dispose и FreeMem. Возвращаемые значения этих функций имеют тип LongInt.
Функция MaxAvail возвращает длину в байтах самого длинного свободного блока. Она находится как максимальное значение из размера свободной части кучи и размеров освобожденных к данному {204} моменту блоков. Выдаваемое MaxAvail значение имеет смысл размера наибольшей сплошной структуры данных (как массив, запись, объект), которая могла бы уместиться в куче. Правда, такая сплошная структура данных сама ограничена размером в 65520 байт.
Полный объем свободного пространства (памяти) в куче можно опросить функцией MemAvail. Она вернет сумму длин всех свободных блоков в куче: и освобожденных, и еще ни разу не использованных.
Эти две функции полезны при анализе ресурсов памяти перед размещением динамических переменных, особенно процедурой GetMem. На рис. 11.6 показан пример их использования.
| PROGRAM TestHeap; {ПРОГРАММА, АНАЛИЗИРУЮЩАЯ МЕСТО В КУЧЕ}
TYPE
Dim = Array [1..5000] of LongInt; { базовый тип }
VAR
P : ^Dim; { ссылка на базовый тип — массив }
Psize : LongInt; { переменная для анализа размера }
CONST
SL = SizeOf(LongInt); { размер элемента массива }
BEGIN
WriteLn( 'В куче свободно ', MemAvail, ' байт' );
{Psize округляется до целого числа значений LongInt:}
Psize := SL*(MaxAvail div SL);
if SizeOf(Dim) > Psize
then begin { мало места в куче }
WriteLn('Массив P^ не может быть размещен целиком'); GetMem( P. Psize ); { отводим Psize байт }
WriteLn( ' Размещено ', Psize div SL, ' элементов' )
end
else begin { достаточно места }
New( P ); { размещаем массив }
Psize := SizeOf(Dim); { объем массива P^ }
WriteLn( 'Динамический массив P размещен' )
end;
{ ... работа с динамическим массивом ... }
FreeMem(P, Psize);{универсальное освобождение массива}
END.
|
Рис. 11.6