Динамические переменные

Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен – к ним обращаются через указатели.

Процедура new(var р : тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель р, и адрес начала этого участка заносит в этот указатель.

Функция new (тип_указателя) : pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка; new применяется для типизированных указателей.

Процедураgetmem(var р : pointer; size : word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю р. Если выделить требуемый объем памяти не удалось, программа аварийно завершается. Указатель может быть любого типа.

Пример

Рассмотрим работу с динамическими переменными, type pword = ^word; rec = record d: word; s: string; end;

var p1, p2: pword; p3: ^rec;

В разделе исполняемых операторов программы запишем операторы:

new (p1); р2:= new (pword); new (р3);

В результате выполнения процедуры new (pi) в хипе выделяется объем памяти, достаточный для размещения переменной типа word, и адрес начала этого участка памяти записывается в переменную р1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром р3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа гес.

Доступ к выделенным областям осуществляется с помощью операции разадресации:

р1^:= 2; р2^:= 4; p3^.d:= pl^; p3^.s:= 'Вася';

В этих операторах в выделенную память заносятся значения. Динамические переменные можно использовать в операциях, допустимых для величин соответствующего типа, например: inc (pl^); р2^:= pl^ + p3^.d; with р3^ do writeln (d, s);

Для освобождения динамической памяти используются процедуры Dispose и Freemem, причем, если память выделялась с помощью new, следует применять Dispose, в противном случае – Freemem.

Процедура Dispose (var р : pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой или функцией new, и значение указателя р становится неопределенным.

Процедура Freemem (var р : pointer; size : word) освобождает участок памяти размером size начиная с адреса, находящегося в р. Значение указателя становится неопределенным.

Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release.

Процедура Mark (var р : pointer) записывает в указатель р адрес начала участка свободной динамической памяти на момент ее вызова.

Процедура Release (var р : pointer) освобождает участок динамической памяти начиная с адреса, записанного в указатель р процедурой Mark.

При завершении программы используемая ею динамическая память освобождается автоматически.

При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof.

 
< Пред   СОДЕРЖАНИЕ     След >