Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник_Часть_1.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
975 Кб
Скачать
☆

13.4. Администратор кучи

Администратор кучи – специальная программа, которая компонуется совместными программами на Паскале и выполняет действия по выделению и освобождению памяти в куче. Имеются стандартные переменные, в которых хранятся адреса кучи (рис. 13.4):

HEAPORG КУЧА - содержит адрес начала кучи

СВОБОДНАЯ

HEAPPTR ЧАСТЬ указатель кучи – текущая граница

свободной динамической памяти

FREELIST первый свободный блок кучи

Heapend содержит адрес конца кучи

Рис. 13.4. Указатели кучи

HEAPERROR обрабатывает ошибки, связанные с выделением памяти в куче.

FREELIST содержит адрес первого свободного блока. Фактически указывает на структуру, предназначенную для описания всех свободных блоков памяти ниже границы.

HEAPPTR содержит адрес нижней границы свободной части кучи.

Они равны, пока память не фрагментирована.

Фрагментация памяти в куче (появление свободных блоков) связана со случайным порядком использования new - dispose и getmem - freemem. Запись, на которую ссылается FREELIST, состоит из двух полей: размер свободного участка и адрес следующего свободного участка (т. е. 4 + 4 = 8 байт). Как только освобождается участок в памяти, в первые 8 байт этого участка помещается запись, на которую указывает FREELIST. Таким образом, все свободные участки в занятой части кучи объединяются в список: в каждом свободном участке содержится указание на следующий участок. Следовательно, администратор кучи всегда может просмотреть весь список свободных блоков.

Mark(p:pointer) – запоминает текущее значение указателя кучи HEAPPTR в переменной p.

Release(p:pointer) – освобождает участок кучи, начиная от адреса, хранящегося в p (запомненного процедурой Mark) до конца кучи (до HEAPPTR). При этом список FREELIST уничтожается.

П р и м е р ы

New(pt1); New(pt2); Mark(M1);

New(pt3); New(pt4); Mark(M2);

New(pt5); New(pt6); New(pt7);

Release(M2);

Release(M1);

Release(Heaporg);

Операторы Mark и Release удобны для программ, в которых порядок освобождения полей обратный порядку их выделения. Не рекомендуется одновременно использовать Release и Dispose, FreeMem.

MAXAVAIL: longint – возвращает размер (в байтах) наибольшего непрерывного участка кучи. За один вызов NEW или GETMEM нельзя зарезервировать памяти больше, чем значение, возвращаемое этой функцией.

MEMAVAIL: longint – возвращает размер общего свободного пространства кучи.

13.5. Примеры использования указателей

      1. Объявление

При объявлении переменной типа «указатель» выделяются лишь ячейки памяти для хранения собственно указателей. В начале работы программы эти ячейки пусты, конкретных адресов в них нет.

П р и м е р ы объявлений:

Type ip = ^integer;

A = array[1..5] of byte;

Var x, y : ip;

B: ^byte;

R: ^real;

Pa: ^A;

p, q: pointer;

Type preco = ^struct;

Struct=record

C:char;

n:integer;

end;