6.4 Уничтожение класса

На верх  Назад  Вперёд

Экземпляр класса всегда должен быть уничтожен с помощью деструктора. В отличии от конструктора, дестуктор определён однозначно: деструктор должен иметь имя Destroy, он должен переопределять деструктор Destroy объявленный в TObject, и не может иметь аргументы, и унаследованный деструктор всегда должен быть вызван.

Чтобы избежать вызова деструктора для экземпляра Nil, лучше вызвать метод Free класса TObject. Этот метод проверит, что Self не Nil, то вызывает Destroy. Если Self равно Nil, он просто выйдет.

Уничтожение экземпляр не освобождает ссылку на экземпляр (переменная по прежнему будет ссылаться на уже не существующий класс):

Var

A : TComponent;

begin

A:=TComponent.Create;

A.Name:='MyComponent';

A.Free;

Writeln('Переменной А - еще присвоен компонент: ',Assigned(A));

end.

После вызова Free, переменная A не будет Nil, программа выведет:

Переменной А - еще присвоен компонент: TRUE

Чтобы убедиться, что переменная A очищена после вызова деструктора нужно вызвать функцию FreeAndNil из модуля SysUtils. Это будет вызывать Free, а затем запишет Nil в указатель на объект (как переменная A в приведенном выше примере):

Var

A : TComponent;

begin

A:=TComponent.Create;

A.Name:='MyComponent';

FreeAndNil(A);

Writeln('Переменной А - еще присвоен компонент: ',Assigned(A));

end.

После вызова FreeAndNil, переменная А будет содержать Nil, вывод этой программы будет:

Переменной А - еще присвоен компонент: FALSE

Примечание:

Если во время выполнения конструктора происходит исключение, деструктор вызывается автоматически.