![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
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;
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; 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;
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. |
|
#2
|
||||
|
||||
|
Esta instruccion
se puede traducir como: 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. |
|
#3
|
||||
|
||||
|
Antes de liberar un array que contiene instacias de objetos, deberías recorrerlo y liberar cada objeto contenido.
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. |
|
#4
|
|||
|
|||
|
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. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Día mundial por la liberación de la cannabis. | poliburro | La Taberna | 60 | 24-10-2024 14:17:55 |
| 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 |
| 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 |
|