Динамические переменные.
Информатика
Если требуется освободить память из-под нескольких переменных одновременно, можно применять процедуры Mark и Release. При работе с динамической памятью часто применяются вспомогательные функции Maxavail, Memavail и Sizeof. При завершении программы используемая ею динамическая память освобождается автоматически. Рассмотрим работу с динамическими переменными, type pword = ^word; rec = record d… Читать ещё >
Динамические переменные. Информатика (реферат, курсовая, диплом, контрольная)
Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм 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.