Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

20.3.Примеры присваивания для указателей

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

var x1, x2:integer; p1,p2:^integer;

p1:=@x1; p1^:=значение1;

p2:=@x2; p2^:=значение2;

p2:=p1; {Копирование адреса}

p2^:=p1^; {Копирование значения}

if p1=p2 then {Сравнение адресов на равенство}

if p1<>p2 then …{Сравнение адресов

на неравенство}

if p1^=p2^ then …{Сравнение значений

возможно любой операцией сравнения}

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

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

Доступ к статическим переменным обычно производится по их именам. Кроме того, для доступа к статической переменной можно использовать и ее физический адрес, который можно получить по операции взятия адреса @имя_переменной и хранить в указателе.

Динамическими переменными называются переменные, память под которые выделяется во время выполнения программы в динамической памяти. Это часть оперативной памяти компьютера, предоставляемая программе при ее работе. Программист сам запрашивает в программе определенный объем динамической памяти для динамической переменной и освобождает эту память после использования динамической переменной. Вся выделенная программе во время ее работы динамическая память освобождается по ее окончанию.

Динамические переменные имени не имеют. Для доступа к ним используются только указатели.

Создание новой динамической переменной базового типа и установка на нее указателя

П усть описан указатель: var p : ^базовый тип

Для создания динамической переменной используется стандартная процедура new(p) , которая выделяет в динамической памяти область памяти, размер которой напрямую зависит от базового типа. Адрес этой области заносится в указатель p. Если свободной динамической памяти недостаточно, выдается ошибка.

Уничтожение динамической переменной, на которую ссылается указатель

dispose(p)

З анимаемая переменной динамическая память освобождается и может использоваться под новые динамические переменные. Значение указателя становится неопределенным. Ему лучше присвоить нулевой адрес: P:=nil.

Проблема потерянных ссылок

  1. При копировании указателей динамическая переменная может оказаться без указателя (будет потеряна). Например: new(p1); new(p2); p2:=p1; В результате на первую динамическую переменную ссылаются два указателя, а вторая динамическая переменная, на которую сначала ссылался p2, осталась без указателя, ею никак нельзя воспользоваться.

  2. Если на одну динамическую переменную ссылаются несколько указателей, например, p1 и p2 в предыдущем пункте, тогда после освобождения памяти dispose(p1) указатель p2 будет указывать на освобожденную память.

  3. Потеря ссылок возможна при использовании локальных указателей в подпрограммах. Например: procedure Proc; var p:^integer; begin … new(p) … end; После выхода из подпрограммы локальный указатель перестает существовать, поэтому нет доступа к памяти, на которую он указывал. Надо либо освобождать динамическую память перед выходом из подпрограммы, либо не использовать локальные указатели.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]