Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 21-12-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
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
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Constructores FairyLady OOP 14 24-11-2011 22:24:05
Sobrecarga de constructores vejerf OOP 2 06-06-2008 12:52:36
Como usar los formularios MDI, constructores de componentes Narlohe OOP 3 11-12-2006 10:54:10
Dudas de como seguir estudiando Gabel Varios 9 14-08-2006 20:33:44
constructores Dantael OOP 2 25-01-2004 23:57:50


La franja horaria es GMT +2. Ahora son las 05:28:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi