Читайте также:
|
|
Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен — к ним обращаются через указатели.
· Процедура new(var p: тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель p, и адрес начала этого участка заносит в этот указатель.
· Функция new(тип_указателя): pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка.
new применяется для типизированных указателей.
· Процедура getmem(var p: pointer; size: word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю p. Если выделить требуемый объем памяти не удалось, программа аварийно завершается. Указатель может быть любого типа.
Пример работы с динамическими переменными.
type pword = ^word; rec = record d: word; s: string; end; var p1, p2: pword; p3: ^rec;В разделе исполняемых операторов программы запишем операторы:
new(p1); p2:= new(pword); new(p3);В результате выполнения процедуры new(p1) в хипе выделяется объем памяти, достаточный для размещения переменной типа word, и адрес начала этого участка памяти записывается в переменную p1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром p3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа rec.
Доступ к выделенным областям осуществляется с помощью операции разадресации:
p1^:= 2; p2^:= 4; p3^.d:= p1^; p3^.s:= 'Вася';В этих операторах в выделенную память заносятся значения.
Динамические переменные можно использовать в операциях, допустимых для величин соответствующего типа, например:
Для освобождения динамической памяти используются процедуры Dispose и Freemem, причем, если память выделялась с помощью new, следует применять Dispose, в противном случае — Freemem.
· Процедура Dispose(var p: pointer) освобождает участок памяти, выделенный для размещения динамической переменной процедурой или функцией New, и значение указателя p становится неопределенным.
· Процедура Freemem (var p: pointer; size: word) освобождает участок памяти размером size, начиная с адреса, находящегося в p. Значение указателя становится неопределенным.
Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release.
· Процедура Mark(var p: pointer) записывает в указатель p адрес начала участка свободной динамической памяти на момент ее вызова.
· Процедура Release(var p: pointer) освобождает участок динамической памяти, начиная с адреса, записанного в указатель p процедурой Mark.
При завершении программы используемая ею динамическая память освобождается автоматически.
При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof.
Дата добавления: 2015-08-13; просмотров: 75 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Вывод численных значений | | | Адреса и указатели |