Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
Liberar memoria en una lista

a) Tengo una clase TObject que se llama "miClase".
b) Esta tiene, entre otras, una variable de tipo TStringList (ej: "mistrings")
c) A su vez trabajo con ellas con una lista de objetos miClase (de nombre: miLista)

Supongan que llega el momento de eliminar un ítem de la lista (con todos sus elementos ya creados y utilizados. Para ello utilizaría el metodo delete:
Código:
miClase(miLista.Items[i]).Delete;
Ahora la pregunta. Si tuviera un afán ordenador superior al que tengo con otros aspectos de mi trabajo, y por tanto quisiera eliminar toda la memoria asignada a este obsoleto menester, ¿es necesario el método free?, o alcanza solo con delete?

Por otra parte: debo liberar el stringlist promero o al liberar el objeto ya se libera la memoria del stringlist incluido.

En concreto, es correcto esto?
Código:
miClase(miLista.Items[i]).mistrings.free; //libero mem de la variable tstringlist
miClase(miLista.Items[i]).Delete; //borro el elemento
miClase(miLista.Items[i]).Free;  //libero mem del elemento
o hay lineas de más o de menos?
Responder Con Cita
  #2  
Antiguo 19-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hasta donde recuerdo, debes hacer el Free de cada objeto de la lista, desde luego antes que el Delete. Y antes del Free debes también liberar el StringList.

En resumen: no hay atajos Debes liberar todo. Siempre.

Lo que te puede ahorrar un poco es usar un TObjectList en lugar de un TList para la lista de objetos miClase. El TObjectList se encarga de liberar la memoria de cada objeto. Eso sí, cada objeto aún debe liberar lo que tenga dentro, como el StringList. Eso debe hacerlo en la redefinición del destructor Destroy.

// Saludos
Responder Con Cita
  #3  
Antiguo 19-09-2006
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
ok, gracias
Responder Con Cita
  #4  
Antiguo 21-09-2006
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Mira lo de liberar la memoria lo hace el free. Quisas el delete llame internamente el free(Tendria que ojear el codigo haber como lo hace).

Pero lo que si estoy seguro es que es c++ cuando liberas memoria con free siempre queda un poco de basura y cuando lo haces con delete se libera un poco mas de memoria. Aunque haorita jamas te darias cuanta. Por que con las capacidades de los equipos ahorita no se nota la diferencia.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #5  
Antiguo 21-09-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Disculpa pero esto no tiene pies ni cabeza. Free y Delete no tienen nada que ver y no se trata de si uno libera un poco más de memoria que el otro. Delete simplemente elimina una entrada de la lista, pero esa entrada no es mas que un apuntador. Si éste apunta a un objeto, tal objeto habrá que liberarlo también con Free. Pero puede apuntar a otra cosa que se haya asignado memoria de otra manera como GetMem y habrá que liberalo con FreeMem.

Y decir que no se nota la diferencia con los equipos de ahora es francamente irresponsable. No importa cuanta memoria tengas, si tu aplicación tiene pérdidas de memoria, el uso continuo eventualmente puede dejar sin recursos al sistema. Jamás debe pasarse por alto este aspecto.

// Saludos
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
Liberar dll de memoria lgarcia Internet 1 11-08-2005 00:26:29
Liberar Memoria JoseQ Varios 6 16-07-2004 18:49:21
Liberar Memoria susje Varios 3 31-07-2003 23:18:18
Liberar memoria del HDC joecool Gráficos 2 17-05-2003 00:28:51
Liberar Memoria JODELSA Varios 4 13-05-2003 17:39:05


La franja horaria es GMT +2. Ahora son las 08:40:32.


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