Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции информатика - Семестр 2.doc
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
516.1 Кб
Скачать

15.2 Статические переменные.

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

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

Динамические переменные, количество которых и место расположения в памяти заранее не известно, невозможно обозначит идентификаторами. Поэтому единственным средством доступа к динамическим переменным является указатель на место их текущего расположения в памяти. На принципе обращения к динамическим переменным посредством указателей (ссылок) на них и основаны все соответствующие средства языка Pascal.

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

15.3. Создание и удаление динамических переменных.

Основные действия над динамическими переменными - создание и уничтожение - реализуется в языке Pascal стандартными процедурами New и Dispose.

Процедура New предназначена для создания динамических переменных определенного типа или, что тоже самое, отведение памяти в куче для хранения динамической переменной. Единственным параметром New является переменная ссылочного типа:

  • в динамической области памяти отводится место для хранения переменной, тип которой совпадает с базовым типом указателя – параметра;

  • переменной, переданной в параметре присваивается указатель на определенную область памяти.

var

p : ^Person;

begin

New (p);

Приведет к отведению в куче области памяти, достаточной для хранения записи типа Person, и присваиванию указателя на эту область переменной p. Доступ возможен только через указатель!

P^.Name := 'Иван';

P^.Sex := male;

….

Если при выполнении New размещение новой переменной в куче не хватает памяти, то значение указателя, переданного в параметре, не изменится. При этом выполнение программы не прекращается и никаких сообщений выдано не будет, поэтому в дальнейшем работать с указателем нельзя. Для избежания этой ситуации следует проверять текущее состояние динамической памяти перед каждым обращением к New. Это можно сделать с помощью стандартной функции MaAvail, которая возвращает максимальный размер непрерывного участка свободной памяти.

Если необходимо создать динамическую переменную типа Longint:

Var

Pl: ^Longint;

Begin

If MaxAvail>=4 then

New(pl)

Else

Writeln('исчерпана динамическая память');

…..

В общем случае для определения размера необходимой памяти можно воспользоваться стандартной функцией size of.

If MaxAvail >= size of(Person) then

P:=new(person);

….

Кроме того в языке имеется функция MemAvail, которая в отличие от MaxAvail определяющую наибольшую свободную непрерывную область, определяет общий объем свободных областей.

Для освобождения памяти используется процедура Dispose. Параметр должен совпадать с базовым типом процедуры и быть ранее объявленным new.

Var

P: ^Person;

Begin

New(p);

(Действия с указателем P)

dispose(p);

end.

Иногда при работе с динамическими переменными возникает проблема потерянных ссылок.

Program Ssylka;

Type

Pperson = ^ person

Person = record

….

End;

Procedure GetPerson;

Var

P: Pperson;

Begin

P:=new(Pperson);

End;

Begin

Writeln(MemAvail);

GetPerson;

Writeln(MemAvail);

End.