В Delphi, почему функция Assigned() все еще возвращает True после вызова деструктора?
Нижеприведенный пример кода будет записывать "sl по-прежнему назначается" на консоль.
Однако я могу назвать FreeAndNil (sl); и он не будет назначен.
Я программировал в Delphi некоторое время, но это никогда не имело смысла для меня.
Может кто-нибудь объяснить?
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Classes;
var
sl : TStringList;
begin
sl := TStringList.Create;
sl.Free;
if Assigned(sl) then
WriteLn('sl is still assigned')
else
WriteLn('sl is not assigned');
end.
Я попытался сравнить операции VCL... FreeAndNil короткий и сладкий и имеет смысл:
procedure FreeAndNil(var Obj);
var
P: TObject;
begin
P := TObject(Obj);
TObject(Obj) := nil; // clear the reference before destroying the object
P.Free;
end;
Но TObject.Free находится в таинственном ассемблере, которого я не понимаю:
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;