En Delphi, ¿por qué la función Assigned() aún devuelve True después de llamar al destructor?¿Por qué se asignan objetos Delphi incluso después de llamar a .Free?
El siguiente código de ejemplo escribirá "sl todavía está asignado" a la consola.
Sin embargo, puedo llamar a FreeAndNil (sl); y no será asignado.
He estado programando en Delphi por un tiempo, pero esto nunca tuvo sentido para mí.
¿Alguien puede explicar?
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.
he intentado comparar las operaciones VCL ... FreeAndNil es corto y dulce y tiene sentido:
procedure FreeAndNil(var Obj);
var
P: TObject;
begin
P := TObject(Obj);
TObject(Obj) := nil; // clear the reference before destroying the object
P.Free;
end;
Pero TObject.Free está en ensamblador misteriosa, que no entiendo:
procedure TObject.Free;
asm
TEST EAX,EAX
JE @@exit
MOV ECX,[EAX]
MOV DL,1
CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
Esta pregunta muestra cómo los programadores podrían confundir los nombres de variables que se encuentran en un ámbito, con objetos que existen enel montón. El objeto es realmente memoria en el montón, y Free libera esa memoria en el montón, pero no es posible que ese método borre la variable local que contiene una REFERENCIA al objeto, pero que NO es el objeto en sí. A pesar de que la semántica del puntero en las referencias del objeto delphi que son punteros a los objetos está en su mayoría oculta, aquí hay un caso en el que se filtra la implementación del puntero subyacente. –