Una de los errores más comunes cuando realizamos un programa con un lenguaje como C, son las fugas de memoria (memory leaks). Este error aunque parezca menor, tiene una gran importancia porque estamos desperdiciando parte de los recursos de nuestro equipo, dejándolos inaccesibles para todos los programas.
Cómo se produce una fuga de memoria
Una fuga de memoria consiste en reservar memoria dinámica y luego modificar el puntero que apunta a esta zona, dejándola inaccesible.
Por ejemplo en este código hay una fuga de memoria, que se produce al reutilizar el puntero sin liberar antes el bloque de 5 enteros:
#include <stdio.h>
#include <stdlib.h>
int main(){
int *pt = NULL;
pt = (int *)malloc(sizeof(int)*5);
//mas codigo ...
pt = (int *)malloc(sizeof(int)*10);
free(pt);
}
Cómo comprobar la ausencia de fugas de memoria
Una de las herramientas con las que podemos comprobar las fugas de memoria es Valgrind, si tenemos Ubuntu la podemos instalar con:
sudo apt-get install valgrind
Para comprobar si tenemos fugas de memoria en nuestro código ejecutamos valgrind y pasamos como argumento nuestro ejecutable.
En la imagen vemos que nos indica que hacemos dos allocs (reserva de memoria) y un único free (liberación de memoria), esto ya nos debe hacer sospechar que tenemos una fuga de memoria. Después nos indica que tenemos una fuga de memoria de tamaño 20 bytes que se encuentran en el mismo bloque. Estos 20 bytes son el resultado de 5 enteros (el tipo int tiene en mi sistema un tamaño de 4 bytes).
Como podéis ver es francamente sencillo comprobar si nuestro programa tiene fugas de memoria, con esta herramienta. Por lo que os recomendamos siempre utilizar esta herramienta para comprobar que vuestro programa este libre de este tipo de errores. Quizás alguno de nuestros lectores piense que perder 20 bytes es algo insignificante, pero si por ejemplo el programa fuera un visor de fotos y cargarse cada foto de 10Mb en memoria, ya tendríamos un importante consumo de memoria.