Ver Mensaje Individual
  #5  
Antiguo 21-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Agustin.
Cita:
Empezado por AgustinOrtu Ver Mensaje
...
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; // igual que: Sender.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'); // no se muestra el mensaje,
  LocalObj.Free;                                               // y nada raro sucede
end;
Hay casos como el tipo string donde no es necesaria la inicialización, aunque hacerlo no provoca perjuicio alguno.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita