Borland Pascal. Руководство пользователя


         

в деструкторе Done является способ,


Важным моментом в деструкторе Done является способ, которым удаляются из списка объекты TEmployee:
Disрose(N.Item, Done);
Здесь N.Item является первым объектом TEmployee в списке, а вызываемый метод Done является деструктором этого объекта. Запом- ните, что действительный тип N^.Item^ не обязательно является ти- пом TEmployee, однако он может быть любым дочерним типом типа TEmployee. Очищаемый объект является полиморфическим и поэтому нельзя сделать никаких предположений относительно его действи- тельного размера или точного его типа на этапе компиляции. В при- веденном выше вызове Disрose, как только Done выполнит все содер- жащиеся в нем операторы, "невидимый" код эпилога ищет размер реа- лизации очищаемого объекта в ТВМ этого объекта. Метод Done пере- дает размер процедуре Disрose, которая затем освобождает точное количество динамической памяти, в действительности занимаемой по- лиморфическим объектом.
Помните, что если должно освобождаться правильное количество динамической памяти, то полиморфический объект должен очищаться только посредством вызова передаваемого Disрose деструктора.
В примере программы Staff объявляется как статическая пере- менная в сегменте данных. Staff мог бы столь же легко разместить- ся в динамической памяти и "прикрепиться к реальному миру" пос- редством указателя типа ListPtr. Если заголовок списка также яв- ляется динамическим объектом, то удаление структуры можно осу- ществить путем вызова деструктора, выполняющегося внутри Disрose:
var Staff: TStaffListPtr; begin Disрose(Staff, Done); . . .
Здесь процедура Disрose вызывает метод деструктора Done для очистки структуры в динамической памяти. Затем, когда Done завер- шается, Disрose освобождает память, на которую указывает Staff, удаляя, как правило, из динамической памяти также и заголовок списка.
Программа WORKLIST.PAS (находящаяся на вашем диске) исполь- зует тот же модуль WORKERS.PAS, что и раньше Она создает объект List, являющийся оглавлением связанного списка из пяти полиморфи- ческих объектов, совместимых с TEmployee, а затем удаляет всю ди- намическую структуру данных с помощью единственного вызова дест- руктора Staff.Done.

Содержание  Назад  Вперед