Saltar al contenido

Controlando fugas de memoria en Lazarus 1.0 (Memory Leaks)

27/03/2013

Las fugas de memorio o en inglés Memory Leaks, se producen cuando un programa se carga en la memoria, y crea v objetos, a los cuales se le asigna un espacio de memoria, y cuando el programa termina de ejecutartse no devuelve todo el espacio de memoria asignado al sistema operativo. Por tanto, si ejecutarmos una y otra vez ese programa, llegaría un momento que el sistema opertativo 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 programado en borrarlo de la memoria. Un ejemplo, tenemos un TStringList llamado Lista, deberíamos programar algo así:

Var

Lista : TstringList;

Begin

Lista := TstringList.Create;

….

FreeAndNil (Lista)

end;

El problema viene a que muchos veces los programas son muy grandes, las prisas, u día malo, etc puede pasar 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 en la opción «enlazado», seleccionamos «Usar unidad Headptr».

Ventana que muestra la opción HeadPtr activa.

Ventana que muestra la opción HeadPtr activa.

 

Activa esta opción, tras crear un proyecto nuevo con un botón en el centro. No añadas nada más, y ejecuta el proyecto. Tras abrirse el programa cierralo y Lazarus mostrará una ventana como esta:

Muestra el resultado del estado de la memoria antes y después de ejecutar el programa

Muestra el resultado del estado de la memoria antes y después de ejecutar el programa

Aunque pone Error, se puede ver que ha ido todo bien. Dice que hay cero bloques de memoria si liberar.

Ahora vamos a añadir el siguiente código al evento «OnClick» del botón:

 

var  i: Integer;
lista: TStringList;
begin
cadena := ‘hola’;
lista := TStringList.Create;
for i := 0 to 20 do
begin
lista.add (‘a’);
end;
end;

Ejecuta el programa, pulsa el botón, y cierrar el programa, verás una pantalla como esta avisando que hay un problema:

Se muestra un error de liberación de memoria. Leyéndolo con calma, se observa que nos dice que hay

Se muestra un error de liberación 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 liberarar ahora pone 2.

Así que tenemos un problema de Fuga de memoria o «Leak Memory». La solución es eliminar nuestra lista cuando ya no la necesitemos, para ello añadimos al final la instrucción «FreeAndNil(Lista);». Esta instrucción se encarga de comprobar si el objeto indicado entre parentesis reside en memory, y en tal caso lo libera.

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
lista: TStringList;
begin
cadena := ‘hola’;
lista := TStringList.Create;
for i := 0 to 20 do
begin
lista.add (‘a’);
end;
FreeAndNil(Lista);
end;

Compila y ejecuta de nuevo el programa, pulsa el botón de la ventana, y cierra el programa, verás que todo ha ido bien.

Saludos

/BlueIcaro

 

No comments yet

Deja un comentario