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

Статической переменной (статически размещенной) называется описанная явным образом в программе переменная, обращение к ней осуществляется по имени. Место в памяти для размещения статических переменных определяется при компиляции программы.

В отличие от таких статических переменных в программах, написанных на языке Turbo Pascal, могут быть созданы динамические переменные. Основное свойство динамических переменных заключается в том, что они создаются и память для них выделяется во время выполнения программы.

Размещаются динамические переменные в динамической области памяти (heap-области).

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

Работа с динамической областью памятью в Turbo Pascal реализуется с

помощью процедур и функций:

Процедура New(var p: Pointer) выделяет место в динамической области памяти для размещения динамической переменной p^ и ее адрес присваивает указателю p.

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

Процедура GetMem(var p: Pointer; size: Word) выделяет участок памяти в heap-области, присваивает адрес его начала указателю p, размер участка в байтах задается параметром size.

Процедура FreeMem(var p: Pointer; size: Word) освобождает участок памяти, адрес начала которого определен указателем p, а размер – параметром size. Значение указателя p становится неопределенным.

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

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

Функция MaxAvail: Longint возвращает длину в байтах самого длинного свободного участка динамической памяти.

Функция MemAvail: Longint полный объем свободной динамической памяти в байтах.

Вспомогательная функция SizeOf(X): Word возвращает объем в байтах, занимаемый X, причем X может быть либо именем переменной любого типа, либо именем типа.

4. Работа с указателями

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

· объявление указателя,

· формирование динамических данных (создание указателей на них),

· использование динамических данных,

· уничтожение ненужных указателей.

Для того чтобы определить значение указателя, нужно использовать процедуру new или присвоить значение другого указателя или константы NIL. В противном случае указатель окажется неопределенным, то есть в памяти под него не будет зарезервировано место.

Var Z1,Z2:Pointertype;

Z2 Z2^ ?
Z1 Z1^ ?
{Z1 и Z2 не определены}

New(Z1); New (Z2);

{ Z1 и Z2 определены, но Z1^ и Z2^ не определены}

       
 
Z1 Z1^
 
Z2 Z2^


Z1^:=10; Z2^:=15;

{Обычное присваивание значения переменным}

       
 
Z1 Z1^
 
Z2 Z2^


Z2^:=Z1^;

{Обычное присваивание значения переменным}

       
 
Z1 Z1^
 
Z2 Z2^


Z1^:=40;

{Обычное присваивание значения переменным}

Z2
Z1 Z1^
Z2:=Z1;

{Присваивание значения указателю!}

{Z2 указывает на другую переменную, чем прежде }

       
 
Z1 Z1^
 
Z2


Z1^:=50

{Обычное присваивание значения переменным}

{но Z2^ это та же переменная, что и Z1^}

{поэтому изменяется вместе с ней}

При присваивании значения Z2:=Z1, переменная Z2 забыла переменную, которая содержала в себе значение 10. Если на нее указывала лишь Z2, то вследствие такого присваивания она стала недостижимой.

Однако мы не можем себе позволить таких «недостижимых» переменных, потому, что для них уже отведена память, и если так делать продолжительное время, то память может неожиданно закончится. Поэтому необходимо освобождать память от неиспользуемых указателей. Для этого служит процедура dispose.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: