Ver Mensaje Individual
  #1  
Antiguo 25-04-2015
doctorhd doctorhd is offline
Miembro
NULL
 
Registrado: abr 2013
Posts: 48
Reputación: 0
doctorhd Va por buen camino
FreeAndNil no libera los recursos

Hola, tengo el siguiente problema, Tengo la clase TConexionBD que es descendiente de un TDSServerModule, que creo vía código, realizando la siguiente llamada:
Código Delphi [-]
FConexionBD:=TConexionBD.Create(FProviderDataBD);{Creamos conexion con la BD}
Donde FProviderDataBD, es una clase que contiene los parámetros de conexión de la BD (Nombre base de datos, login, password, ruta BD, etc). El constructor de TConexionBD es el siguiente:
Código Delphi [-]
constructor TConexionBD.Create(AProvider:TProviderData);
begin
  inherited create(nil);{creamos el objeto}
  FManagerConexion:=TFDManager.Create(nil);{creamos manejador de conexion}
  FConexion:=TFDConnection.Create(nil);{Creamos contenedor de conexion}
  FConexion.LoginPrompt:= False;{Desactivamos el Prompt}
  FTransaction:=TFDTransaction.Create(nil);{Creamos manejador de transaciones}
  FConexion.Transaction:=FTransaction;{Asignamos la transacion}

  FParams:=TStringList.Create;{Creamos el contenedor de parametros de conexion}
  setParam(AProvider);{Creamos los parametros de conexion de acuerdo al proveedor de datos}
  setConexion(AProvider);{Establecemos definicion de la conexion de acuerdo al proveedor de datos}
end;{constructor}
Y el destructor de TConexionBD es el que sigue:
Código Delphi [-]
procedure TConexionBD.DSServerModuleDestroy(Sender: TObject);
begin
  Disconect;{Desconectamos la conexion con la BD}
  funGlobal.CloseObjet([FParams,FDPhysFBDriverLink,FTransaction,FConexion,FManagerConexion]);
end;{procedure}
Destructor que es llamado de la siguiente forma:
Código Delphi [-]
procedure TSystemClass.DestroyConexionBD;
begin
  funGlobal.CloseObjet([FConexionBD]);{cerramos los objetos}
end;{procedure}

procedure TfunGlobal.CloseObjet(AObjeto:Array of TObject);
var vIndice:Integer;
begin
  for vIndice:= Low(AObjeto) to High(AObjeto) do begin
    if Assigned(AObjeto[vIndice]) then FreeAndNil(AObjeto[vIndice]);{Liberamos la memoria}
  end;
end;{procedure}
Como verán la destrucción la llevo a cavo utilizando el método freeandnil y validando con assigned que el objeto halla sido creado con anterioridad. Es de suponer que al destruir el objeto este quedara en nil, pero no es así. Si llamo a DestroyConexionBD dos veces en la segunda llamada dispara un error de violación de acceso, esto no debería pasar ya que Assigned comprueba que el objeto este creado para destruirlo.
Preguntaran porque llamo 2 veces al destructor. El objeto se crea en forma manual por el usuario y también lo puede destruir el mismo usuario, pero los procedimientos al estar contenidos en un form la destrucción también se lleva a cavo al cerrar el form. Es decir, puede ocurrir que el usuario cierre el objeto y después al cerrar el form el cierre ocurre nuevamente. ¿Es correcta la forma de ?destruir el objeto?, ¿Assigned, comprueba realmente que el objeto ha sido creado?...

Saludos....
Responder Con Cita