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