Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Обработка ошибок при работе с динамическими объектами

Динамические объекты. Деструкторы.

 

Экземпляры объектовых типов могут быть определены также и динамически, с использованием стандартной процедуры New. На практике этот способ применяется значительно чаще. Экземпляр в общем виде определяется так:

Var <имя ссылки на объект>^. <тип объекта>

Техника динамического порождения и инициализации объектов выглядит для нашего примера следующим образом:

Var ObCirclePtr: ^Circle;

begin

New (ObCirclePtr);

ObCirclePtr^.Init (20, 30, 10);

………………………

В целях большей наглядности Turbo Pascal допускает совмещение порождения объекта и его инициализации конструктором в одном вызове New:

New (ObCirclePtr, Init (20, 30, 10));

Освобождение динамической памяти, выделенной объекту, реализуется стандартной процедурой Dispose: Dispose (<имя ссылки на объект>);

Необходимо учесть, что если поля данных объекта были динамическими и для них выделялась дополнительная память, то их надо освободить до уничтожения самого объекта. Для этих целей или для других завершающих действий перед уничтожением вводится специальный вид метода – деструктор. Он объявляется среди прочих методов с помощью замены ключевого слова Procedure на служебное слово Destructor. Функции деструктора по сути противоположны функциям конструктора. Действие завершается ключевым словом Done. Деструкторы могут наследоваться, при этом желательно делать их виртуальными, чтобы выполнялся тот деструктор, который соответствует именно этому типу объекта.

Имеется также расширенная возможность использования процедуры уничтожения: Dispose (<имя ссылки на объект>, <имя деструктора>); При этом вначале выполняется деструктор, а затем объект уничтожается.

Если объект содержит виртуальные методы, то деструктор осуществляет поиск размера объекта, т.е. того участка памяти, который нужно уничтожить. Чтобы выполнение уничтожения было корректным, используют пустой блок: Begin End;

 

 

HeapError – системная переменная, имеющая указательный тип pointer. Она указывает на функцию:

HeapError:= @HeapFunc;

Function HeapFunc (Size: word): integer;

Данная функция вызывается каждый раз, когда работают процедуры генерирования динамического объекта, и когда не может быть выполнен запрос на распределение объекта. Здесь Size указывает на то, какой блок памяти не может разместиться в динамической памяти. В качестве результата функция возвращает значения 0, 1 или 2. Если функция возвращает значение 0, то осуществляется аварийный останов. Если значение 1, то при выполнении процедуры New (P) ссылка на объект принимает значение константы. Если значение 2, то вызов повторяется.

{$F+}

Function HeapFunc (Size: word): integer;

begin

HeapFunc:=1;

end;

{$F-}

New (P);

if P = nil then <обработка исключительной ситуации>

else <нормальный ход программы>

Таким образом, если мы имеем расширенные процедуры генерирования объекта (New (<>,<>)), необходимо учитывать следующее: когда начинает выполняться тело конструктора, то при выполнении алгоритма может потребоваться дополнительная память. В этом случае мы должны сделать откат, т.е. отменить все проделанные распределения в конструкторе и, в завершение, освободить экземпляр типа объекта. Ссылка должна получить значение константы. Для выполнения отката используется стандартная процедура Fail, располагающаяся в конструкторе. Вызов этой процедуры освобождает динамический экземпляр, который был размещен в памяти до входа в конструктор, и возвращает в ссылке значение nil.

Нехватка памяти может иметь место и для статических объектов с динамическими полями. Так как объект статический, то необходимо передать сигнал о невозможности распределения. В этом случае имя конструктора используется как логическая функция (если значение False, то распределение невозможно).

 

<== предыдущая лекция | следующая лекция ==>
Полиморфизм. Виртуальные методы | СД типа дерево
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 372; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.