Warum gibt die Funktion Assigned() in Delphi immer True zurück, nachdem ich den Destruktor aufgerufen habe?Warum werden Delphi-Objekte auch nach dem Aufruf von .Free zugewiesen?
Der folgende Beispielcode schreibt "sl ist immer noch zugewiesen" an die Konsole.
Allerdings kann ich FreeAndNil (sl) anrufen; und es wird nicht zugewiesen.
Ich habe in Delphi für eine Weile programmiert, aber das hat nie Sinn für mich gemacht.
Kann jemand erklären?
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.
Ich versuchte, die VCL-Operationen zu vergleichen ... FreeAndNil ist kurz und süß und macht Sinn:
procedure FreeAndNil(var Obj);
var
P: TObject;
begin
P := TObject(Obj);
TObject(Obj) := nil; // clear the reference before destroying the object
P.Free;
end;
Aber TObject.Free ist in mysteriösem Assembler, was ich nicht verstehe:
Diese Frage zeigt, wie Programmierer Variablennamen conflate könnte, die in einem Rahmen sind, mit Objekten, die onthe Haufen existieren. Das Objekt ist tatsächlich Speicher auf dem Heap, und Free gibt diesen Speicher auf dem Heap frei, aber es ist nicht möglich, dass diese Methode die lokale Variable löscht, die eine REFERENCE für das Objekt enthält, die jedoch NICHT das Objekt selbst ist. Obwohl die Pointer-Semantik in Delphi-Objektreferenzen, die Zeiger auf Objekte sind, größtenteils verborgen ist, folgt hier ein Fall, bei dem die zugrundeliegende Zeigerimplementierung durchleckt. –