Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-03-2012
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Problema con la liberación de memoria.

Hola amigos foreros. Estoy aquí nuevamente con un gran problema para mí pero que sin duda para ustedes será pan comido.
El problema lo trataré de presentar de la forma más simple, tengo una instancia creada con el siguiente código:

Código:
TInstancia = class(TObject)           //Definición de una instancia
  private
    function NormaCuadrado(A:VectorIR; B:VectorIR):Double;         //Función interna y privada
    procedure Mutar();
    procedure ActualizarCGyVDistancia_en_Mutar(ClsVieja:Integer; ClsNueva:Integer; PosiIndividuo:Integer);
  protected
  public
    VClasificacion:VectorInt;   //Vector de clasificación (1,1,2,3,2,...) Significa Ind1 en Clase 1, Ind2 en clase 2...
    VDistancias:VectorIR;       //Vector que contiene las distancias de cada indi al CG de la Clase a la que pertenece.
    MatrizCG:MatrizReal;        //Los CG de las instancia por filas: Fila 1 CG de clase 1, Fila 2 CG clase 2...
    Inercia:Double;             //Inecia de la intacia: Suma de los valores del vector VDistanacias.
    VectorCardi:VectorInt;      //Cardinalidades de las clases, en la pasición i se encuentra la cardinalidad del la cls i+1.
    function PosiClaseMasPopulosa(): Integer;
    function Clon():TInstancia;
  published
  end;
Para evitar las referencias por medio de punteros, dicha Instancia tiene una función de clonación dada por:
Código:
function TInstancia.Clon():TInstancia ;
begin
  Result:=TInstancia.Create;
  Result.VClasificacion:=Copy(Self.VClasificacion);
  Result.VDistancias:=Copy(Self.VDistancias);
  Result.MatrizCG:=Copy(Self.MatrizCG);
  Result.Inercia:=Self.Inercia;
  Result.VectorCardi:=Copy(Self.VectorCardi);
end;
Bueno, el problema es el siguiente. Suponga que se tiene un vector lleno de objetos de clase TInstancia, supongalo de tamaño N. Luego de pasar por un procedimiento, se debe aumenta el tamaño del vector aumenta en una cantidad mayor que N, y se desea luego hacer una selección de los mejores N objetos. (No importa que significa mejores), suponga que se seleccionan los primeros N de esa nueva lista.


Eso lo hice con el siguiente procedimiento:

Código:
   
   SetLength(VInstanciasAux,N);
   for i:=0 to N-1 do begin
     VInstanciasAux[i]:=TInstancia.Create;
     VInstanciasAux[i]:=Self.VInstancias[i].Clon;
   end;
   Self.VInstancias:=nil;
   SetLength(Self.VInstancias,NInstActual);
   Self.VInstancias:=VInstanciasAux;
  VInstanciasAux:=nil;
El problema es el siguiente, cuando N es grande y los vectores de cada una de las Instancias son grandes, 500 entradas aproximadamente cada uno. Luego de un tiempo me tira el siguiente error:



Finalmente, he notado que el ram de mi computadora se agota durante la corrida. Estoy trabajando con una Toshiba Qosmio con un i7 y con 8 GB de ram. No he podido liberar la memoria que ya he utilizado.

Si necesitan más información, por favor indique me lo que necesitan saber.
Responder Con Cita
  #2  
Antiguo 10-03-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Esta instruccion
Código Delphi [-]
   for i:=0 to N-1 do begin
     VInstanciasAux[i]:=TInstancia.Create;
     VInstanciasAux[i]:=Self.VInstancias[i].Clon;
   end;
se puede traducir como:
Código Delphi [-]
   for i:=0 to N-1 do begin
     VInstanciasAux[i]:=TInstancia.Create;
     // VInstanciasAux[i]:=Self.VInstancias[i].Clon;
        VInstanciasAux[i]:=TInstancia.Create;
        VInstanciasAux[i]:=Copy(Self.VClasificacion);
        VInstanciasAux[i]:=Copy(Self.VDistancias);
        VInstanciasAux[i]:=Copy(Self.MatrizCG);
        VInstanciasAux[i]:=Self.Inercia;
        VInstanciasAux[i]:=Copy(Self.VectorCardi);
   end;
Como ves, estas creando y volviendo a crear la misma variable.
La primera vez que lo creas VInstaciaAux[i] apunta a un lugar de memoria, que cuando no lo necesites mas deberás liberar.
Cuando le asignas la segunda creación, apuntará a otro lugar de la memoria y te habrá quedado una instancia en el limbo.

Esto es el error que veo, pero podría haber otros, dependiendo de como trates a las instancias generadas cuando modificas el tamaño del array VInstanciasAux.
Responder Con Cita
  #3  
Antiguo 10-03-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Antes de liberar un array que contiene instacias de objetos, deberías recorrerlo y liberar cada objeto contenido.
Código Delphi [-]
  for i := 0 to LargoDe(VInstanciasAux) -1 do
     VInstanciasAux[i].Free;
  VInstanciasAux:=nil;
Lo mismo vale para cuando cambias el tamaña a uno menor. Deberías recorrer la parte "sobrante" liberando objetos antes de aplicar el nuevo tamaño.
Responder Con Cita
  #4  
Antiguo 12-03-2012
TecnoBestia TecnoBestia is offline
Miembro
 
Registrado: jun 2010
Posts: 35
Poder: 0
TecnoBestia Va por buen camino
Gracias

Muchas gracias.

No sabía que debía liberar objeto por objeto antes de asignarle nil a un vector. Pero me quedó claro.

Gracias por su tiempo, me ha ayudado mucho.
Responder Con Cita
Respuesta



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
Liberación de memoria de Tbitmap Marck Silencer Gráficos 11 27-01-2011 08:29:06
Liberación de un Form No Modal vejerf OOP 1 06-09-2010 19:41:20
Día mundial por la liberación de la cannabis. poliburro La Taberna 54 10-05-2008 04:55:56
Liberación de memoria de punteros Data de un Tree. afxe Varios 5 20-06-2007 17:12:34
Liberación de memoria Jome OOP 5 22-02-2007 14:44:56


La franja horaria es GMT +2. Ahora son las 04:04:07.


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