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



         

Пример размещения динамического объекта - часть 3


Важным моментом в деструкторе 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.




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