• Jueves 14 de Noviembre de 2024, 04:31

Autor Tema:  Una Duda  (Leído 1989 veces)

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Una Duda
« en: Sábado 6 de Mayo de 2006, 21:30 »
0
Espero que esto no sea el colmo , pero cuando creo un programa, es necesario liberar la memoria?  :huh:  y se liberaria a cada componente? o en general (de una wena vez)   <_< a todo el conjunto?  :hola:

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Una Duda
« Respuesta #1 en: Sábado 6 de Mayo de 2006, 23:21 »
0
Pues claro que es necesario liberar la memoria y mejor si es justo después que ya no se necesita más.

Existe una herramienta para delphi llamada "MemProof" que te permite saber si al finalizar el programa quedaron algunos punteros "vivos", es decir que no liberaste memoria.

Si no notaste "memory leaks" aparentes es por que Delphi tiene un sistema que optimiza esto de reservar y liberar memoria. En lugar de molestar al sistema operativo para reservar y liberar pequeños bloques de memoria lo que hace delphi es reservar y liberar bloques de memoria de tamaño razonable en megas, dependiendo de la necesidad del momento. Esta técnica es bastante beneficiosa en tiempo de CPU si tienes un algoritmo que reserva y libera en todo momento apenas unos puñados de bytes. Por otra parte si un programador se olvido de liberar memoria en su programa, al cerrar el programa hecho en delphi correrá el código de gestión de memoria liberando toda la memoria que reservo el usuario (siempre y cuando lo hizo con las funciones estándar de Delphi y directamente del S.O.).

Sin embargo en el caso de servicios que corren 24 horas al día y 7 días a la semana el simple hecho de no liberar algunos bytes de memoria es terrible por que estos se van acumulando y al cabo de unos meses terminan reventando al servidor y ocasinando la necesidad de reiniciarlo. En este caso el codigo generado por el compilador delphi no te ayudará a evitar este desastre puesto que la liberación final sólo corre al terminar la ejecución del programa y estamos hablando de servicios que se suponen que tienen que correr por lo menos un año continuo sin perder estabilidad.

Perrero

  • Miembro MUY activo
  • ***
  • Mensajes: 209
    • Ver Perfil
Re: Una Duda
« Respuesta #2 en: Lunes 8 de Mayo de 2006, 00:08 »
0
Estuve investigando y decubri que para liberar la memoria con codigo,se tiene que poner la siguiente instruccion en el evento OnClose del form:

Código: Text
  1. Action:= caFree
  2.  

Mi duda es que si, en el mismo evento, al poner primero esa instruccion y luego lea otras, no hay problema cuando libere la memoria?, ya que el programa deja de funcionar cuando termina de leer todas las instrucciones que se encuentran en el evento. Por ejemplo:

Código: Text
  1.  
  2. Action:= caFree;    <-------- aca
  3. If (MessageBox(0',parrafo','titulo',mb_YESNO+mb_ICONQUESTION)<>IDYES then
  4.   Action:= caNone;
  5. Action:= caFree;   <--------- o aca
  6.  
  7.  

Osea esta bien que me libere la memoria antes o despues, pero si lo pongo despues es probable que no se lea? o si necesariamente

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Una Duda
« Respuesta #3 en: Lunes 8 de Mayo de 2006, 02:46 »
0
En realidad esa asignación no libera memoria, sólo es una asignación de un valor a una variable.

La liberación de memoria ocurre DESPUES de ejecutar el código del evento OnClose: Se revisa el valor de esa variable y si es el caso se procede a liberar la memoria utilizada por el formulario, OJO que antes de esto se llama al evento onDestroy para que puedas liberar la memoria que reservaste por tu cuenta y luego procede a liberar la memoria de los controles "hijos" que tiene el formulario en cascada (botones, edits, etc.) llamando a cada respectivo destructor que a su vez se encarga de llamar a otros hasta que todo el proceso termine al final con la destrucción (liberación de la memoria) del formulario padre.

Asi que no importa donde pongas la asignación, sólo es para avisar que lo que quieres es cerrar y además destruir el formulario.