![]() |
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;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 |
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 |
ok, gracias
|
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. |
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 |
| La franja horaria es GMT +2. Ahora son las 13:58:33. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi