Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Liberar memoria de objetos y listas (https://www.clubdelphi.com/foros/showthread.php?t=53185)

aggg63 13-02-2008 14:23:44

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;

jachguate 13-02-2008 17:35:08

No te fijes en los datos del administrador de tareas.

Podrías usar MemProof para analizar si tu aplicación tiene MemoryLeaks, o si tenes BDS 2006 o superior, podes usar el define del compilador REPORTMEMORYLEAKS del manejador de memoria (FastMM) para que la misma aplicación te reporte si hay problemas con la memoria.

Una vez tu programa ponga disponible la memoria, ya windows decidirá cuando usarla de nuevo.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 05:46:12.

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