![]() |
como aumenta la memoria asignada a delphi
no se si esta bien dicho, pero cada 2x3 me da error de memoria o pila desbordada y tal, supongo q es por haber ejecutado varias veces mi programa y se queda sin memoria, aunq no deberia ser asi, pero bueno alguien sabe como se sube la memoria asignada a pila y demas cosas??
|
Hola djanp,
Asegúrate de que estás liberando la memoria de todo objeto que creas. Y si estás usando estructuras dinámicas en las que se empleen punteros. Por ejemplo:
Recuerda que tu debes realizar Dispose. Por cada New que hayas realizado, un Dispose debe ser efectuado cuando ya no se necesita. Delphi libera la memoria que emplea. Ese es el comportamiento predeterminado... Pero si haz estado creando objetos y no le haz estado asignando un "dueño" para que éste se encargue de liberarlo de la memoria, la obligación recae en ti en ir liberandolos. Por empezar se me ocurre que empieces a analizar si algo queda por ahi sin liberar. A falta de muestra de código no te sabría decir que y/o donde está fallando. Saludos, |
cierto q no he liberado memoria de lo que creo, algo q tendre q ir añadiendo, pero no uso punteros, solo forms con sus botoncitos y tal
tal vez se quede en memoria las 30 tablas q abro y no se borre al cerrar la aplicacion |
¿Concretamente que es lo que estás creando?
¿Por tablas te refieres a TTables? Si por las tablas y/o cualquier otro componente que se emplee para el acceso a base de datos no creo que sea el problema. Tengo entendido, corrijanme si me equivoco, que Delphi una vez que se cierra la aplición se cierran todas las secciones que hayan abiertas, por lo que se cierran todas las tablas, las Querys, los dataset, etc... Saludos, |
si a ttables , datasources y demas me refiero,
tal vez sea q tengo q hacer en cada form.: procedure TFclientes.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; end; pero si cierro la aplicacion de golpe no haria falta hacer esto no?? |
djanp,
Close no libera a menos que lo indiques. Para ello es el valor caFree. Por defecto es caHide (en SDI). Por lo que cuando tu presionas en la X, a menos que cambies el valor a caFree lo único que hará es ocultarse la forma y todo lo que ésta contenga seguirá estando en memoria. Si estas creando objetos en runtime conviene forzar la liberación de memoria. Delphi libera la memoria disponible cuando se cierra la aplicación... y eso funcionará siempre que todo lo que creas tiene dueño. Si no lo tiene... tu mismo deberás programar cuando liberarlo. El hecho de que tengas caFree no te garantiza que toda la memoria se liberará. Saludos, |
Dicho de otra Forma:
Si tienes puesto caFree en el FormClose, dicho form se libera de memoria RAM, y todos los componentes que sea dueño. Si los TTables los tienes puestos en ese Form en tiempo de diseño, también se liberan al cerrar el Form. Si en tu código haces: tabla1 := TTable.Create(nil); ese no se libera, tienes que liberarlo tú con tabla1.Free; Si en tu código usas: tabla1 := TTable.Create(Self); o bien tabla1 := TTable.Create(FClientes); entonces sí se libera automáticamente. Saludos |
Cita:
En turbo pascal, podías cambiar el tamaño de la pila con la directiva {$M StackSize, MinHeapSize, MaxHeapSize} del compilador. Nunca he tenido necesidad de hacer esto en Delphi (10 años usándolo) por lo que ignoro si el compilador soporta la directiva. Como ya he dicho... lo mas seguro es que haya una llamada recursiva infinita. Hasta luego. ;) |
Cita:
Saludos |
La franja horaria es GMT +2. Ahora son las 13:16:48. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi