Пример: просмотр количества динамической памяти до и после выделения блока

Type

T_s=string[1];

Var

P0:^T_s;

Begin

Writeln(memavail); 570200

New(p0);

Writeln(memavail); 570192

Dispose(p0); 570200

Freelist – данный указатель содержит адрес описателя первого свободного блока.

В момент загрузки программы указатели Freelist, heapOrg и heapPtr содержат один и тот же адрес. указатели Freelist и heapPtr в ходе работы с кучей будут иметь одни и те же значения до тех пор пока в куче не образуется свободный блок памяти расположенный ниже границы которую указывает heapPtr на этот блок и будет указывать Freelist.

Если в процессе работы с кучей образуется блок ниже по адресу блока на который указывает Freelist, то этот указатель будет указывать на вновь образовавшийся блок. Если освободившейся блок выше блока с этим указателем то указатель останется на месте.

Если текущий блок является последним в списке свободных блоков то его описатель содержит адрес heapEnd и длину равную 0.

Любой новый блок памяти выделяется с адреса Freelist только в том случае если свободный блок связанный с этим указателем имеет подходящий размер, иначе ищется блок определенного размера путем прохода по всему списку свободных блоков, если подходящий блок не найден, то запрашиваемый блок выделяется адреса heapPtr (если хватает памяти).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: