Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   manejo de la memoria en delphi (https://www.clubdelphi.com/foros/showthread.php?t=6980)

jac000y 29-01-2004 14:08:17

manejo de la memoria en delphi
 
Estoy trabajando con Delphi 7 y Windows 2000

1. ejecuto una aplicacion hecha en delphi

2. abro el administrador de tareas de windows 2000 y voy
a la solapa procesos y Mi aplicacion ocupa una cierta cantidad de
memoria

3. abro una ventana en Mi aplicacion y veo que en el administrador de
tareas de windows, mi aplicacion ocupa mas memoria,

PERO: cuando cierro la ventana (Form.Free), no vuelve a la cantidad
de memoria que estaba ocupando anteriormente, si no, un poco mas

4. despues de unos minutos la memoria se descarga, eso no seria problema

5. el problema es que si uso mi aplicacion continuamente, la cantidad de memoria se va incrementando constantemente.



6 ........ Hay alguna forma de ir liberando esa memoria??????


7. tiene algo que ver con el famoso error ? :

Access violation at address XXXXXXX. Read of address XXXXXXXX.



gracias a todos

marto 29-01-2004 16:21:41

Cita:

Empezado por jac000y
3. abro una ventana en Mi aplicacion y veo que en el administrador de
tareas de windows, mi aplicacion ocupa mas memoria,

PERO: cuando cierro la ventana (Form.Free), no vuelve a la cantidad
de memoria que estaba ocupando anteriormente, si no, un poco mas

Quando usas forms, tu aplicación está haciendo llamadas a funciones que están en dll's del sistema. Estas dll's no se descargan automáticamente, sino que tardan un tiempo. Eso explicaría el retraso.

Cita:

Empezado por jac000y

7. tiene algo que ver con el famoso error ? :

Access violation at address XXXXXXX. Read of address XXXXXXXX.

Pues puede ser.... si no nos dices el contexto en el que se produce...

delphi.com.ar 02-02-2004 16:15:31

Te recomiendo leer este artículo: Liberando memoria inactiva (Marteens)

Saludos!

i.larranaga 03-02-2004 10:10:40

problemas con la memoria
 
Hola a todos,
yo tengo un problema parecido al comentado, mi programa va cogiendo y cogiendo RAM según se está ejecutando. He estado mirándolo un poco y resulta que por algún lado no libero memoria. Os pongo un ejemplo de una función del programa, el cual tiene el dicho problema:

function TForm.Funcion(const BMP: TBitmap): TBitmap;
var
x,y: Word;
Line1,Line2: PByteArray;
begin
//Crear y asignar BMP
Result:=TBitmap.Create;
Result.Assign(BMP);
//Recorre la imagen línea a línea
for y:=0 to Result.Height-1 do
begin
//Asigna los valores a los punteros
Line1:=BMP.ScanLine[y]; //*
Line2:=Result.ScanLine[y]; //*
//Recorre pixel a pixel
for x:=0 to Result.Width-1 do
begin
//Realiza operaciones
end;
end;
end;

La cuestión es que no sé porqué cuando hace * parece que se hace una copia de la imagen en memoria, y luego al acabar la función esta memoria no se libera y se va acumulando en sucesivas llamadas a la función.

He probado a hacer una copia de la variable de entrada y luego liberarlo con .Free, y así si he conseguido liberar la parte correspondiente de memoria, pero no consigo liberar la correspondiente a Result o a la salida.

¿Cómo podría conseguirlo? ¿Y porqúe si en * asigno punteros se crea una copia de la imagen y ocupa memoria?

Muchas gracias a todos por vuestra ayuda y un saludo.
:confused:

jachguate 03-02-2004 10:59:30

Cita:

Empezado por i.larranaga
parece que se hace una copia de la imagen en memoria, y luego al acabar la función esta memoria no se libera y se va acumulando en sucesivas llamadas a la función.
:confused:

Pues no "parece que se hace una copia"... mas bien seguro que se hace una copia en:

Código:

  Result:=TBitmap.Create;
  Result.Assign(BMP);

Si queres que esa memoria se libere, la llamada de la función debiera ser algo como:

Código:

Var
  MyBMP : TBMP;
Begin
  MyBMP := Funcion(OtroBMP);
  try
    // hacer cosas;
  finally
    MyBMP.Free;
  end;
end

o bien:

Código:

Begin
  with Funcion(OtroBMP) do
    try
      // hacer cosas;
    finally
      Free;
    end;
end;

ya que el objeto se crea dentro de la rutina, y no parece que liberes el recurso fuera, según tu explicación.

El hacer una copia de la variable de entrada y luego liberarla... no tiene sentido.

Hasta luego.

;)

i.larranaga 03-02-2004 11:52:00

gestionando bien la memoria
 
Hola otra vez,

ya he probado lo que decías, y ahora la memoria que se reservaba para el Result ya la libero desde la función que llama a la que he expuesto. No obstante, te volveré a explicar mejor el problema. Cuando se llama a la función, como tú decías se copia la imagen con assign, pero todavía no aumenta la memoria en uso. Cuando hago line1:=... es cuando aumenta la memoria en uso, y también cuando hago line2:=... Como ésta última la libero después desde la función desde la que he llamado a ésta, quedaría resuelto, pero el line1:=... que se refiere a la variable de entrada (constante, no sé si esto influirá) es el que me da problemas ahora. Con esta asignación del linescan se reserva memoria, pero no se cómo liberarla luego, ya que no puedo hacer un Free de la variable de entrada, pues ésta se pierde.
¿Qué es lo que podría hacer con este problema?
Muchas gracias por tu ayuda y un saludo.

jachguate 03-02-2004 12:27:46

La verdad nunca he usado el método ScanLine, y la documentación no es clara en cuanto a si reserva memoria o no. Dado que devuelve un puntero, te recomiendo que revises el código y/o documentación del API, y si reserva memoria, llamés al método adecuado para liberarla después de haber terminado de usarla.

Hasta luego.

i.larranaga 03-02-2004 15:03:28

Memoria ocupada por Bitmaps
 
Hola otra vez,
al final he tenido que hacer una copia a una variable local del parametro de entrada para asociarlo con el puntero, y luego una vez acabada la función he hecho un Free a esta variable. con esto he conseguido liberar la memoria. Se que no es lo óptimo pero funciona. Si encuentras la razón de mis problemas hazmelo saber, por favor. Muchas gracias por tu ayuda y un saludo.


La franja horaria es GMT +2. Ahora son las 22:21:13.

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