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

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

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

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

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

Пример

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

var pi, p2: pword; p3: Arec;

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

new (pi); р2:= new (pword); new (рЗ);

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

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

р1А:= 2; р2А:= 4; p3A.d:= pi/4; p3A.s:= 'Вася';

В этих операторах в выделенную память заносятся значения. Динамические переменные можно использовать в операциях, допустимых для величин соответствующего типа, например: inc (pi/4); р2А:= pi/4 + p3A.d; with p3A 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.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >