русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2015-07-09; просмотров: 575; Нарушение авторских прав


Для выделения памяти под объекты используются процедура и функция new.

На­пример, если определены указатели:

type

pmonstr = *monstr:

pdaemon = ^daemon; var pm : pmonstr; pd : pdaemon;

можно создать объекты с помощью вызовов:

new(pm); { или pm := new(pmonstr); } new(pd); { или pd := new(pdaemon); }

 

Обратите внимание, что при использовании new в форме процедуры параметром является указатель, а в функцию передается его тип. Так как после выделения памяти объект обычно инициализируют, в Паскале для удобства определены расширенные формы new с двумя параметрами. На месте второго параметра зада­ется вызов конструктора объекта:

new(pm, initd, 1, 1, 1);

{ или

pm := new(pmonstr, initCl. 1, 1, 1));

} '

new(pd, initd, 1, 1, 1, 1):

{или

pd := new(pdaemon. initd, 1, 1, 1, D);

}

Для освобождения памяти, занятой объектом, применяется процедура Dispose:

Dispose(pm); При выполнении этой процедуры освобождается количество байтов, равное раз­меру объекта, соответствующего типу указателя. Следовательно, если на самом деле в указателе хранится ссылка на объект производного класса, который, как известно, может быть больше своего предка, часть памяти не будет помечена как свободная, но доступ к ней будет невозможен, то есть появится мусор. Второй случай появления мусора возникает при применении процедуры Dispose к объекту, поля которого являются указателями.

Для корректного освобождения памяти из-под полиморфных объектов следует использовать вместе с процедурой Dispose специальный метод — деструктор. Ему рекомендуется давать имя done, например:

destructor monstr.done:

begin

end:

Для правильного освобождения памяти деструктор записывается вторым пара­метром процедуры Dispose:

Dispose(pm, done);

Это верно только для виртуальных методов.

Для простых объектов деструктор может быть пустым, а для объектов, содержа­щих динамические поля, в нем записываются операторы освобождения памяти для этих полей. В деструкторе можно описывать любые действия, необходимые для конкретного объекта, например закрытие файлов. Исполняемый код деструк­тора никогда не бывает пустым, потому что компилятор по служебному слову destructor вставляет в конец тела метода операторы получения размера объекта из VMT. Деструктор передает этот размер процедуре Dispose, и она освобождает количество памяти, соответствующее фактическому типу объекта. (Вызов деструктора вне процедуры Dispose память из-под объекта не освобождает)



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

Ход работы:

Задание 1. Наберите и проанализируйте программу. Определите в данной программе все динамические объекты и методы применяемые к этим объектам. Объясните результаты выполнения программы.

program polivir;

uses Crt;

const

LENLIST=10; { длина списка }

type

 

TPerson = object

FName: string[30]; { имя }

FAddress: string[40]; { адрес }

constructor init(Name,Address:string);{ конструктор объекта }

destructor Done; virtual;{ деструктор объекта }

procedure print; virtual;

end;

 

TStudent = object(TPerson)

FGroup: integer; { учебная группа }

constructor init(Name,Address:string;Group:integer);

destructor Done; virtual;

procedure print; virtual;

end;

 

TProf = object(TPerson)

FKafedra: string[30]; { кафедра }

constructor init(Name,Address,Kafedra:string);

destructor Done; virtual;

procedure print; virtual;

end;

 

PStudent=^TStudent;

PProf=^TProf;

 

constructor TPerson.init(Name,Address:string);

begin

FName:=Name;

FAddress:=Address;

end;

 

destructor TPerson.Done;

begin

end;

 

procedure TPerson.print;

begin

writeln(FName);

writeln(FAddress);

end;

 

constructor TStudent.init(Name,Address:string;Group:integer);

begin

TPerson.init(Name,Address);

FGroup:=Group;

end;

 

destructor TStudent.Done;

begin

inherited Done; { вызов деструктора родительского типа }

end;

 

procedure TStudent.print;

begin

TPerson.print;

writeln('úα. ',FGroup);

end;

 

constructor TProf.init(Name,Address,Kafedra:string);

begin

TPerson.init(Name,Address);

FKafedra:=Kafedra;

end;

 

destructor TProf.Done;

begin

inherited Done;

end;

 

procedure TProf.print;

begin

TPerson.print;

writeln('K. ',FKafedra);

end;

 

var

list: array[1..LENLIST] of ^TPerson;

i:integer;

 

begin

{ инициализация списка }

for i:=1 to LENLIST do

list[1]:=NIL;

 

{ создать три объекта и поместить в список }

list[1]:=new(PStudent,init('Михаил Иванов','Лесной пр, д.29, корп.6ф, комн.211',3813));

list[2]:=new(PStudent,init('Цветков Станислав','пр. К.Маркса, д.32, кв.3',3813));

list[3]:=new(PProf,init('Некрасов Степан Петрович','Институтский пр., д.7, кв.13','Управление проектами'));

 

{ вывести объекты – элементы списка }

for i:=1 to LENLIST do

if list[i] <> NIL

then list[i]^.print;

 

{ уничтожить объекты }

for i:=1 to LENLIST do

if list[i] <> NIL

then

begin

Dispose(list[i],Done);

list[i]:=NIL;

end;

 

Readln;

 

end.



<== предыдущая лекция | следующая лекция ==>
Гомель, 2010 | Гомель, 2010


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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