2012-03-17 3 views
0

Мне интересно, почему после того, как я вызываю метод Free, объект не является nil.
Что я имею в виду, например, следующий класс:Класс деструктора в TObject и NIL Delphi

type Ta = class(TObject) 
public 
    i: integer; 
    destructor Destroy; override; 
end; 

destructor Ta.Destroy; 
begin 
    inherited; 
end; 

procedure Form1.Button1; 
var a: Ta; 
begin 
    a := Ta.Create;  
    a.Free; 

    if a = nil then 
    button1.Caption := 'is assigned' 
    else 
    button1.caption := 'is not assigned'; 
end; 

Мой вопрос, почему после освобождения объекта не nil и как я буду делать a быть nil после деструктора без использования a := nil?

+6

Освобождение объекта не устанавливает его в ноль. use FreeAndNil (a) – kobik

+0

И вы не можете сделать это от деструктора? – user558126

+4

Нет, вы не можете. – kobik

ответ

10

Объяснение:

Переменная a только станет nil когда назначенnil. Это значит, что код a := nil в коде отсутствует.

Бесплатно только метод, работающий над экземпляром класса Ta. Free уничтожает тот экземпляр, на который указывает a. Значение из a по-прежнему остается неизменным и теперь указывает на адрес памяти, где когда-то был экземпляр Ta.

Решение:

Использование FreeAndNil(a) одновременно уничтожить объект, к которому переменная указывает на и nillify переменную.

3

Метод экземпляра не может изменить переменную экземпляра, в которой был вызван метод. Это потому, что метод передается копией переменной экземпляра (неявный параметр Self), а не передается с ссылкой на переменную экземпляра.

Смежные вопросы