Подпрограммы динамического распределения памяти

 

Создать динамическую переменную можно с помощью одной из следующих подпрограмм.

1. Процедура New(var p: <указатель>) выделяет место в динамически распределяемой области памяти, называемой «кучей», для размещения переменной базового типа указателя p и начальный адрес присваивает переменной p.

2. Функция New(<имя ссылочного типа>):pointer выделяет место в динамически распределяемой области памяти для размещения переменной указанного в качестве параметра типа и возвращает адрес выделенной области.

3. Процедура GetMem (var p:pointer; n:word) выделяет в «куче» блок памяти размером n, начальный адрес блока помещает в p. Если ртипизованный указатель, то значением второго параметра должен быть размер базового типа указателя. Для его определения удобно использовать функцию SizeOf(<имя типа>|<выражение>):word, которая возвращает размер своего параметра в байтах.

Если по какой-либо причине место для размещения переменной не может быть выделено, то происходит аварийный останов.

Функция MaxAvail:LongInt возвращает размер максимального свободного блока в «куче». С ее помощью можно проверить, достаточно ли места для размещения динамической переменной. Функция MемAvail:LongInt возвращает суммарный размер всех свободных блоков.

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

Dispose(var p: <типизованный указатель>)

или

FreeMem(var p: pointer; size:word).

Dispose освобождает память, занимаемую переменной базового типа указателя р. FreeMem освобождает блок памяти размером size байтов с начальным адресом р. В качестве параметра size должен быть указан размер динамической переменной. Каждому обращению к подпрограмме выделения памяти должна соответствовать процедура освобождения памяти.