Ver Mensaje Individual
  #1  
Antiguo 13-02-2008
aggg63 aggg63 is offline
Miembro
 
Registrado: sep 2005
Posts: 31
Reputación: 0
aggg63 Va por buen camino
Liberar memoria de objetos y listas

Hola.

Tengo este algoritmo (resumido) con un par de objetos Datos y Campo, que genera una lista de datos. El problema esta en que no consigo liberar toda la memoria que utilizo cuando finaliza. Es recursivo, los datos del nivel siguiente dependen del anterior y finalizo cuando el nivel es cero. Libero las listas y objetos con FreeAndNil o Free, pero veo en los recursos de Windows que la memoria no se libera. Solo cuando cierro la aplicacion dentro del IDE se libera la memoria. ¿Alguien podria indicarme que hago mal, que me falta para liberar la memoria? Uso Delphi 2005 Personal Edition y no domino mucho los objetos.

Muchisimas gracias.


Código Delphi [-]

type
TDatos = class
private Datos1,Datos2: integer;
public function GenDatos(Datos: integer): boolean;
TCampo = class
public Campo1,Campo2: integer;
procedure GenerarCampo(estado: string)
procedure GenerarListaDatos(ListaDatos: TObjectList);
var
Campo: TCampo;
procedure TCampo.GenerarListaDatos(ListaDatos: TObjectList); var
Datos: TDatos;
i: integer;
begin
for i:=0 to 10 do begin
Datos:=TDatos.Create;
Datos.GenDatos(i);
ListaDatos.Add(Datos);
end;
end; procedure CopiarDatos(Original,Copia: TCampo); begin
Copia.Datos1:=Original.Datos1;
Copia.Datos2:=Original.Datos2;
end; procedure TfrmFormulario.CalculoCampos(nivel: integer); var
CopiaCampo: TCampo;
ListaCampos: TObjectList;
i: integer;
begin
if nivel=0 then exit;
CopiaCampo:=TCampo.Create;
CopiarDatos(Campo,CopiaCampo);
ListaCampos:=TObjectList.Create(TRUE);
Campo.GenerarListaDatos(ListaCampos);
for i:=0 to pred(ListaCampos.Count) do begin
Campo.CambiarDatos(TCampo(ListaCampos[i]));
CalculoCampos(nivel-1);
CopiarDatos(CopiaCampo,Campo)
end;
//ListaCampos.Clear;
//FreeAndNil(CopiaCampo);
//FreeAndNil(ListaCampos);
CopiaCampo.Free;
ListaCampos.Free;
end; procedure TfrmFormulario.btnCalcularNodosClick(Sender: TObject); var
CopiaCampo: TCampo;
ListaDatos: TObjectList;
i: integer;
begin
Campo:=TCampo.Create;
CopiaCampo:=TCampo.Create;
Campo.GenerarDatos(estado);
CopiarDatos(Campo,CopiaCampo);
ListaDatos:=TObjectList.Create(TRUE);
Campo.GenerarListaDatos(ListaDatos);
for i:=0 to pred(ListaDatos.Count) do begin
Campo.CambiarDatos(TCampo(ListaDatos[i]));
CalculoCampos(strtoint(txtNivel.text));
CopiarDatos(CopiaCampo,Campo);
end;
FreeAndNil(CopiaCampo);
FreeAndNil(Campo);
FreeAndNil(ListaCampos);
//ListaDatos.Free;
//CopiaCampo.Free;
//Campo.Free;
end;

Última edición por aggg63 fecha: 13-02-2008 a las 14:42:33.
Responder Con Cita