Информатика и информационные технологии: конспект лекций
Добавить в закладки К обложке
- ЛЕКЦИЯ № 1. Введение в информатику - Страница 1
- 2. Системы счисления - Страница 2
- 3. Представление чисел в ЭВМ - Страница 3
- 4. Формализованное понятие алгоритма - Страница 4
- ЛЕКЦИЯ № 2. Язык Pascal - Страница 5
- 2. Стандартные процедуры и функции - Страница 6
- 3. Операторы языка Pascal - Страница 8
- ЛЕКЦИЯ № 3. Процедуры и функции - Страница 10
- 2. Процедуры в Pascal - Страница 11
- 3. Функции в Pascal - Страница 12
- 4. Опережающие описания и подключение подпрограмм. Директива - Страница 13
- ЛЕКЦИЯ № 4. Подпрограммы - Страница 14
- 2. Типы параметров подпрограмм - Страница 15
- ЛЕКЦИЯ № 5. Строковый тип данных - Страница 17
- 2. Процедуры и функции для переменных строкового типа - Страница 18
- 3. Записи - Страница 19
- 4. Множества - Страница 20
- ЛЕКЦИЯ № 6. Файлы - Страница 21
- 2. Модули. Виды модулей - Страница 24
- ЛЕКЦИЯ № 7. Динамическая память - Страница 26
- 2. Работа с динамической памятью. Нетипизированные указатели - Страница 27
- ЛЕКЦИЯ № 8. Абстрактные структуры данных - Страница 28
- 2. Стеки - Страница 29
- 3. Очереди - Страница 30
- ЛЕКЦИЯ № 9. Древовидные структуры данных - Страница 31
- 2. Операции над деревьями - Страница 32
- 3. Примеры реализации операций - Страница 33
- ЛЕКЦИЯ № 10. Графы - Страница 34
- 2. Представление графа списком инцидентности. Алгоритм обхода графа в глубину - Страница 35
- 3. Представление графа списком списков. Алгоритм обхода графа в ширину - Страница 36
- ЛЕКЦИЯ № 11. Объектный тип данных - Страница 37
- 2. Наследование - Страница 39
- 3. Создание экземпляров объектов - Страница 40
- 4. Компоненты и область действия - Страница 41
- ЛЕКЦИЯ № 12. Методы - Страница 42
- 2. Конструкторы и деструкторы - Страница 44
- 3. Деструкторы - Страница 45
- 4. Виртуальные методы - Страница 47
- 5. Поля данных объекта и формальные параметры метода - Страница 48
- ЛЕКЦИЯ № 13. Совместимость типов объектов - Страница 49
- 2. Расширяющиеся объекты - Страница 50
- 3. Совместимость типов объектов - Страница 52
- ЛЕКЦИЯ № 14. Ассемблер - Страница 53
- 2. Программная модель микропроцессора - Страница 54
- 3. Пользовательские регистры - Страница 55
- 4. Регистры общего назначения - Страница 56
- 5. Сегментные регистры - Страница 57
- 6. Регистры состояния и управления - Страница 58
- ЛЕКЦИЯ № 15. Регистры - Страница 59
- 2. Регистры управления - Страница 60
- 3. Регистры системных адресов - Страница 61
- 4. Регистры отладки - Страница 62
- ЛЕКЦИЯ № 16. Программы на Ассемблере - Страница 63
- 2. Синтаксис ассемблера - Страница 64
- 3. Директивы сегментации - Страница 68
- ЛЕКЦИЯ № 17. Структуры команд на Ассемблере - Страница 71
- 2. Способы задания операндов команды - Страница 73
- 3. Способы адресации - Страница 75
- ЛЕКЦИЯ № 18. Команды - Страница 77
- 2. Арифметические команды - Страница 81
- ЛЕКЦИЯ № 19. Команды передачи управления - Страница 90
- 2. Команды передачи управления - Страница 95
3. Деструкторы
Borland Pascal предоставляет специальный тип метода, называемый сборщиком мусора (или деструктором) для очистки и удаления динамически размещенного объекта. Деструктор объединяет шаг удаления объекта с какими-либо другими действиями или задачами, необходимыми для данного типа объекта. Для единственного типа объекта можно определить несколько деструкторов.
Деструктор определяется совместно со всеми другими методами объекта в определении типа объекта:
tyрe
TEmployee = object
Name: string[25];
Title: string[25];
Rate: Real;
constructor Init(AName, ATitle: String; ARate: Real);
destructor Done; virtual;
function GetName: String;
function GetTitle: String;
function GetRate: Rate; virtual;
function GetPayAmount: Real; virtual;
end;
Деструкторы можно наследовать, и они могут быть либо статическими, либо виртуальными. Поскольку различные программы завершения, как правило, требуют различные типы объектов, обычно рекомендуется, чтобы деструкторы всегда были виртуальными, благодаря чему для каждого типа объекта будет выполнен правильный деструктор.
Зарезервированное слово destructor не требуется указывать для каждого метода очистки, даже если определение типа объекта содержит виртуальные методы. Деструкторы в действительности работают только с динамически размещенными объектами.
При очистке динамически размещенного объекта деструктор осуществляет специальные функции: он гарантирует, что в динамически распределяемой области памяти всегда будет освобождаться правильное число байтов. Не может быть никаких опасений по поводу использования деструктора применительно к статически размещенным объектам; фактически, не передавая типа объекта деструктору, программист лишает объект данного типа полных преимуществ управления динамической памятью в Borland Pascal.
Деструкторы в действительности становятся самими собой тогда, когда должны очищаться полиморфические объекты и когда должна освобождаться занимаемая ими память.
Полиморфические объекты – это те объекты, которые были присвоены родительскому типу благодаря правилам совместимости расширенных типов Borland Pascal. Экземпляр объекта типа THourly присвоенный переменной типа TEmployee, является примером полиморфического объекта. Эти правила также могут быть применены к объектам; указатель на THourly может свободно быть присвоен указателю на TEmployee, а указуемый этим указателем объект опять же будет полиморфическим объектом. Термин «полиморфический» является подходящим, так как код, обрабатывающий объект, «не знает» точно во время компиляции, какой тип объекта ему придется в конце концов обработать. Единственное, что он знает, – это то, что этот объект принадлежит иерархии объектов, являющихся потомками указанного типа объекта.
Очевидно, что размеры типов объектов отличаются. Поэтому, когда наступает время очистки размещенного в динамической памяти полиморфического объекта, то как же Dispose узнает, сколько байт динамического пространства нужно освобождать? Во время компиляции из полиморфического объекта нельзя извлечь никакой информации относительно размера объекта.
Деструктор разрешает эту головоломку путем обращения к тому месту, где эта информация записана, – в ТВМ переменных реализаций. В каждой ТВМ типа объекта содержится размер в байтах данного типа объекта. Таблица виртуальных методов любого объекта доступна посредством скрытого параметра Self, посылаемого методу при вызове метода. Деструктор является всего лишь разновидностью метода, и поэтому, когда объект вызывает его, деструктор получает копию Self через стек. Таким образом, если объект является полиморфическим во время компиляции, он никогда не будет полиморфическим во время выполнения благодаря позднему связыванию.
Для выполнения этого освобождения памяти при позднем связывании деструктор нужно вызывать как часть расширенного синтаксиса процедуры Dispose:
Dispose(P, Done);
(Вызов деструктора вне процедуры Dispose вообще не выполняет никакого освобождения памяти.) Здесь происходит на самом деле то, что сборщик мусора объекта, на который указывает Р, выполняется как обычный метод. Однако, как только последнее действие выполнено, деструктор ищет размер реализации своего типа в ТВМ и пересылает размер процедуре Dispose. Процедура Dispose завершает процесс путем удаления правильного числа байт пространства динамической памяти, которое (пространство) до этого относилось к Р^. Число освобождаемых байт будет правильным независимо от того, указывал ли Р на экземпляр типа TSalaried, или он указывал на один из дочерних типов типа TSalaried, например на TCommissioned.