Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции 26.27.doc
Скачиваний:
1
Добавлен:
11.07.2019
Размер:
88.58 Кб
Скачать

5. Понятие о динамических объектах.

Объектные переменные совершенно подобны переменным других типов Турбо Паскаля. Как мы уже отмечали, для них допустим оператор присваивания и обращение к полям и методам по составным именам (как для записей). Экземпляры объектов можно размещать и в динамической памяти. Экземпляры объектов, размещаемые в динамической памяти, называются динамическими объектами.

Для создания динамических объектов необходимо создать типизированный указатель на заданный тип объекта. Объявление такого указателя выполняется по обычным правилам, принятым для указателей на типы Турбо Паскаля. Например:

type pLine = ^Line; {указатель на объект типа Line }

var pL1:pLine; {динамический объект типа pLine}

Динамические объекты чрезвычайно полезны для задач моделирования, управления, проектирования. Библиотеки объектов в большинстве своём содержат динамические объекты, как например Turbo Vision -библиотека объектов интерфейса.

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

6. Расширенное использование процедуры new.

При работе с динамическими объектами процедуру new (выделения хип-памяти под типизированные указатели) можно использовать с расширенными возможностями:

- в ней допускается второй параметр, в котором можно указывать обращение к конструктору для инициализации динамического объекта;

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

Такие расширенные средства позволяют одновременно, и зарезервировать хип-память для динамического объекта и разместить в ней некоторое (начальное) значение (с помощью конструктора). В теле конструктора допускается создание нового динамического объекта и так далее. В такой ситуации (использования нескольких уровней вложенности) проблемой может стать нехватка распределяемой хип-памяти. При нехватке хип-памяти необходимо ликвидировать всю цепочку размещенных объектов. Эту операцию может выполнить стандартная процедура fall, которую можно вызывать только из конструктора и которая освобождает выделенную память, возвращая значение указателя nil. Примеры расширенного использования new:

var pL1:^Line; {динамический объект типа Line}

. . . .. .. .

new(pL1,Init); {Init - конструктор для инициализации объекта pL1}

. . .. . . .. .

pL1:= new(Line, Init); {инициализация pL1 с помощью функции new}

7. Освобождение хип-памяти от динамических объектов.

При удалении динамического объекта иногда помимо освобождения хип-памяти необходимо выполнить и некоторые другие процедуры (например, коррекцию списка динамических объектов).

Поэтому в Турбо Паскале для удаления динамических объектов предусмотрен особый метод - деструктор, описываемый с помощью ключевого слова destructor. В деструкторе следует выполнить все действия, связанные с ликвидацией динамического объекта. В отличие от конструктора деструктор может быть и виртуальным.

Для удобства использования деструктора предусмотрено расширенное использование стандартной процедуры dispose - освобождения хип-памяти. В этой процедуре разрешено применять кроме обычного параметра (переменной типа указатель) также второй параметр - имя деструктора объекта. Например:

type Line = object (point);

. . . . . .

constructor Init;

destructor Done;

end {Line}.

new(pL1, Init); {Создание динамического объекта pL1}

. . . . . .

dispose(pL1, Done); {Удаление динамического объекта pL1}