Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Estudiando constructores y destructores

Segun la documentacion, en el constructor de un objeto todas las referencias a otros objetos son asignadas automaticamente a NIL

Es decir, teniendo esta clase

Código Delphi [-]
  TTestClass = class
  public
    Object: TObject;
  end;

procedure Test;
var
  LTest: TTestClass;
begin
  LTest := TTestClass.Create;
  LTest.Object ---> NIL

  LTest.Object.Free --> Llamada segura, Free va a chequear que el objeto no es nil y no se ejecuta el destructor, no hay riesgo de Acess Violation
end;

Esto funciona de maravillas y no he tenido nunca problemas con eso (una vez que lo entendi claro)

Hasta que hoy, haciendo experimentos raros, se me ocurrio hacer esto:

Código Delphi [-]
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FormFoo: TObject;
  end;

procedure TForm2.Button1Click(Sender: TObject);
var
  LocalFoo: TObject;
begin
  FormFoo.Free;

  LocalFoo.Free;
end;

Obviamente llamar a FomFoo.Free es seguro, de hecho el destructor no se ejecuta; las variables de instancia son seteadas a nil en los constructores de los objetos (que va, TForm es un objeto tambien, recuerda? )

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.

Los invito a que ejecuten el mismo codigo

Para el que no se le ocurra, puede agregar la linea ShowMessage(LocalFoo.ClassName); antes del Free
Responder Con Cita
 



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 16:20:04.


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