Detección de fugas
Conceptos básicos de memcheck
Detección de fugas es una lección gratuita de C Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C Academy incluye 4 lecciones en total.
Qué es una fuga
Una fuga de memoria ocurre cuando asigna memoria del heap con malloc, calloc o realloc y pierde todos los punteros que apuntan a ella antes de llamar a free.
El bloque permanece reservado, pero inaccesible, hasta que termina el proceso. En programas de ejecución prolongada, las fugas se acumulan hasta agotar la memoria.
Una fuga mínima
Este programa pierde un bloque de 40 bytes.
El puntero p es una variable local. Cuando main retorna, p desaparece, pero el bloque del heap al que apuntaba nunca se libera.
#include <stdlib.h>
int main(void) {
int *p = malloc(10 * sizeof(int));
p[0] = 1;
return 0; /* never free(p) */
}Ejecutar memcheck
memcheck es la herramienta predeterminada, por lo que puede omitir el nombre de la herramienta.
Añada --leak-check=full para obtener una traza de la pila de cada asignación perdida.
gcc -g -O0 -o leak leak.c
valgrind --leak-check=full ./leakEl resumen de fugas
Al salir, Valgrind imprime un LEAK SUMMARY. Para el programa anterior, muestra aproximadamente:
definitely lost: 40 bytes in 1 blocks
La traza señala el punto exacto de la llamada a malloc, por lo que sabrá con precisión qué asignación nunca se liberó.
Las cuatro categorías de fugas
memcheck clasifica la memoria perdida en cuatro categorías:
- definitely lost — no queda ningún puntero; es una fuga real
- indirectly lost — solo se puede acceder a ella a través de un bloque definitivamente perdido
- possibly lost — solo queda un puntero al interior del bloque
- still reachable — existe un puntero al salir, pero nunca liberó el bloque
Definitely lost frente a still reachable
definitely lost es la categoría urgente: esos bytes nunca se pueden recuperar mientras el programa se está ejecutando.
still reachable es menos grave. El bloque queda sin liberar al salir, pero un puntero global o estático aún hace referencia a él; normalmente se trata de una asignación única que simplemente nunca se preocupó por liberar.
Fugas indirectas
Cuando pierde el inicio de una estructura enlazada, todos sus nodos se vuelven inaccesibles.
El inicio aparece como definitely lost y el resto como indirectly lost. Al corregir la causa raíz, es decir, el inicio perdido, recuperará todo.
struct Node { int v; struct Node *next; };
struct Node *make(void) {
struct Node *h = malloc(sizeof *h);
h->next = malloc(sizeof *h);
h->next->next = NULL;
return h;
}
/* if the caller drops the returned head, both nodes leak */La versión corregida
Libere todo lo que asigne. Esta versión no produce ninguna fuga.
Con Valgrind, informa All heap blocks were freed -- no leaks are possible.
#include <stdlib.h>
int main(void) {
int *p = malloc(10 * sizeof(int));
p[0] = 1;
free(p);
return 0;
}Contar asignaciones
Incluso sin fugas, el HEAP SUMMARY le indica la actividad de su programa:
total heap usage: 1 allocs, 1 frees, 40 bytes allocated
Cuando el número de asignaciones y liberaciones coincide, la ejecución es correcta. Una discrepancia es el primer indicio de que algo se escapó.
Mostrar bloques accesibles
De forma predeterminada, memcheck no muestra en detalle los bloques still reachable. Para auditarlos también, añada:
--show-leak-kinds=all
Esto fuerza una traza para cada categoría y resulta útil cuando quiere que el programa libere absolutamente todo antes de salir.
valgrind --leak-check=full --show-leak-kinds=all ./leakFugas en rutas de error
Las fugas más difíciles de detectar se ocultan en las rutas de retorno anticipado. En este caso, si falla la segunda asignación, el primer bloque se pierde.
Las pruebas habituales rara vez recorren estas ramas, pero memcheck las detecta siempre que se ejecuta la ruta correspondiente. Libere siempre lo que tenga antes de retornar por un error.
char *a = malloc(100);
char *b = malloc(100);
if (!b) {
/* bug: a is leaked here */
return -1;
}
/* fix: free(a); before returning */Comprobación rápida
Elija la categoría de fugas que requiere atención más urgente.
Repaso
Ahora puede detectar fugas con memcheck:
- Ejecute
valgrind --leak-check=full ./progsobre un binario compilado con-g - Lea el LEAK SUMMARY y el HEAP SUMMARY
- Priorice definitely lost y siga después las fugas indirectas hasta su raíz
- Use
--show-leak-kinds=allpara auditar los bloques still-reachable
A continuación: acceso no válido a la memoria.
Preguntas frecuentes
¿La lección «Detección de fugas» es gratis?
Sí — el texto completo de «Detección de fugas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C Academy, actualiza a CoddyKit PRO. El curso de C Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Detección de fugas»?
Conceptos básicos de memcheck Practicas C Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C Academy?
No se requiere experiencia previa. C Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Detección de fugas»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C Academy?
Sí. Cada lección de C Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué usar Valgrind
- Detección de fugas
- Accesos no válidos
- Lectura de informes