Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   como aumenta la memoria asignada a delphi (https://www.clubdelphi.com/foros/showthread.php?t=51628)

djanp 21-12-2007 13:02:10

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??

Delphius 21-12-2007 13:18:06

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:

Código Delphi [-]
PNodo = ^TNodo;
TNodo = record
   Valor: integer;
   Sig: PNodo;
end;

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,

djanp 21-12-2007 13:24:21

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

Delphius 21-12-2007 13:34:04

¿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,

djanp 21-12-2007 13:36:44

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??

Delphius 21-12-2007 13:48:50

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,

Lepe 21-12-2007 14:43:32

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

jachguate 21-12-2007 21:07:55

Cita:

Empezado por djanp (Mensaje 253889)
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??

Si el error es de pila desbordada (stack overflow) y no de No hay memoria disponible (Memory not available), muy probablemente el problema está en una llamada recursiva, directa o indirecta, que está ejecutándose muchísimas veces.

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.

;)

Lepe 22-12-2007 12:22:44

Cita:

Empezado por jachguate
Nunca he tenido necesidad de hacer esto en Delphi (10 años usándolo) por lo que ignoro si el compilador soporta la directiva.

En projects -> options está la cajita para indicar el tamaño de pila (call Stack).

Saludos


La franja horaria es GMT +2. Ahora son las 14:27:55.

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