Класс деструкторов в TObject и NIL Delphi - PullRequest
0 голосов
/ 18 марта 2012

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

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?

Ответы [ 2 ]

10 голосов
/ 18 марта 2012

Пояснение:

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

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

Решение:

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

3 голосов
/ 18 марта 2012

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

...