FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
Cita:
Cita:
__________________
E pur si muove |
#3
|
||||
|
||||
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#4
|
|||
|
|||
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. |
#5
|
||||
|
||||
Cita:
Código:
Result:=TBitmap.Create; Result.Assign(BMP); Código:
Var MyBMP : TBMP; Begin MyBMP := Funcion(OtroBMP); try // hacer cosas; finally MyBMP.Free; end; end Código:
Begin with Funcion(OtroBMP) do try // hacer cosas; finally Free; end; end; El hacer una copia de la variable de entrada y luego liberarla... no tiene sentido. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
|||
|
|||
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. |
#7
|
||||
|
||||
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.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#8
|
|||
|
|||
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. |
|
|
|