11.5.4. Функции MaxAvail и MemAvail
Обе эти функции анализируют количество свободной памяти, как еще не использованной, так и получившейся в результате освобождения динамических переменных процедурами Dispose и FreeMem. Возвращаемые значения этих функций имеют тип LongInt.
Функция MaxAvail возвращает длину в байтах самого длинного свободного блока. Она находится как максимальное значение из размера свободной части кучи и размеров освобожденных к данному
- 205 -
моменту блоков. Выдаваемое 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