En el 2013, escribí una entrada para un blog que mantenía de por aquel tiempo. Esta entrada comentaba el método o sistema que implementa Lazarus para controlar las fugas memoria.

El método no ha cambiado, aunque si la manera de activarlo y alguna detalle más que se añadió, me he animado a actualizar aquella entrada.

Las fugas de memoria o en inglés Memory Leaks, se producen cuando un programa se carga en la memoria, y crea objetos, a los cuales se le asigna un espacio de memoria, y cuando el programa termina de ejecutarse no devuelve todo el espacio de memoria asignado al sistema operativo. Por tanto, si ejecutamos una y otra vez ese programa, llegaría un momento que el sistema operativo no tendría más memoria para ejecutar programas.

La solución a este problema en Lazarus, «sobre el papel», es muy sencillo. Cada objeto que cree el programador, debe encargarse el mismo programador en borrarlo de la memoria. Un ejemplo, tenemos un TStringList llamado Lista, deberíamos programar algo así:

El problema viene que muchos veces los programas son muy grandes, las prisas, un día malo, etc., puede hacer que te olvides de liberar el objeto.

Para eso Lazarus, pone a nuestra disposición un herramienta que analiza nuestro programa tras ejecutarse y nos dice dónde se han producido «Leaks memory». Para activarla vamos a opciones de proyecto en el menú proyecto (Shift+ctrl+F11) y seleccionamos Configuración y objetivo.

Opciones de proyecto

Ahora pulsamos, sobre los tres puntos, en la parte superior, para crear los modos de construcción.

Modos de construcción.

Y para terminar pulsamos sobre Crear los modos de depuración y liberación.

Modos de depuración y liberación

Ahora solo hay que aceptar en todas la ventanas abiertas.

En la ventana principal de Lazarus, arriba a la izquierda existe un icono con forma de engranaje, si lo despliegas verás que hay 3 modos. Según el que tengas seleccionado, el programa se compilara con unas opciones u otras. El modo que nos interesa cuando estamos probando el programa en modo depuración. Así que selecciónalo y hagamos una prueba.

Modos de compilación

Vuelve a ejecutar el programa anterior y al cerrarlo aparecerá un informe, mostrando que no hay ningún bloque de memoria sin liberar.

En caso contrario mostraría un informe más detallado. Por ejemplo, el siguiente código:

Al cerrarse el programa obtendríamos el siguiente resultado.

Fuga de memoria

Con detalle, se observa que al final, indica que el problema se produce en la línea 55 del evento Click de un TButton. Además dónde antes decía cero bloques si liberar ahora pone 2.

Por supuesto la solución pasa por liberar el objeto Lista.

Al compilar el programa en este modo, el archivo ejecutable es muy grande ya que contiene la información para poder depurarlo. Cuando hayamos terminado de depurar nuestro programa, podemos compilarlo en modo release (o liberación). Para ello solo hay que cambiar el modo en el icono del engrane, tal como se mostró anteriormente.

Un detalle a tener en cuenta, que cuando compilas el programa en Windows, al terminar se muestra una ventana emergente. Si se compila en Linux, esta ventana no se muestra.

Para ver la información debemos abrir la consola de Entrada y Salida, para ello, usando el menú Ver, dentro de ventanas de depuración seleccionar Console In/Output.

Saludos

Un comentario en «Controlando fugas de memoria en Lazarus»
  1. Me alegra mucho ver que sigue habiendo gente que trabaja en la divulgación de temas de Lazarus.
    ¡¡¡Enhorabuena!!!

    P.D.: He intentado contactar contigo pero la página de contacto da un error

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.