Hola Agustin.
Cita:
Empezado por AgustinOrtu
...
Pero el problema son las variables locales; es verdad, de hecho tiene logica, que si yo declaro una variable, y no la inicializo nunca, el valor no esta definido; es decir que una llamada a Free deberia arrojar una excepcion Acess Violation. Bueno, curiosa fue mi sorpresa al correr el codigo anterior: no se elevo ninguna excepcion.
|
A mi modo de ver,
LocalFoo.Free no genera una excepción por que cuando se declara una variable local (en la pila),
Delphi no inicializa la referencia y tiene un valor que apunta a una dirección indeterminada, normalmente basura (aunque excepcionalmente podría ser
nil).
Por otro lado el método
TObject.Free está implementado así,
Código Delphi
[-]
procedure TObject.Free;
begin
if Self <> nil then Destroy;
end;
pero por ser
LocalFoo una variable local y no estar inicializada, no tendrá el valor
nil sino garbage y se llamará al método
Destroy sobre la dirección del invocante (
Sender en el caso).
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
LocalObj: TObject;
begin
if LocalObj = Sender then ShowMessage('LocalObj referencia lo mismo que Sender');
LocalObj.Free; end;
Es por eso que se insiste en inicializar las variables locales:
Código Delphi
[-]
procedure TForm1.Button2Click(Sender: TObject);
var
LocalObj: TObject;
begin
LocalObj := nil;
if LocalObj = Sender then ShowMessage('LocalObj es Sender'); LocalObj.Free; end;
Hay casos como el tipo
string donde no es necesaria la inicialización, aunque hacerlo no provoca perjuicio alguno.
Saludos