0Pricing
C Academy · Lección

Liberar memoria y evitar fugas

Limpie los recursos correctamente

Liberar memoria y evitar fugas es una lección gratuita de C Academy en CoddyKit. Esta es la lección 4 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.

Todo malloc necesita un free

La memoria del heap permanece reservada hasta que la libera con free. Si pierde el único puntero a un bloque sin liberarlo, esa memoria queda fugada.

Las fugas se acumulan con el tiempo y pueden agotar la memoria en programas de larga duración.

int *a = malloc(100 * sizeof(*a));
/* ... use a ... */
free(a);

Qué hace realmente free

free(p) devuelve el bloque al asignador para que pueda reutilizarlo. No cambia el valor de p.

Después de free, p sigue apuntando a la dirección anterior, que ahora no es válida. Acceder a ella produce un comportamiento indefinido.

free(p);
/* p is now a dangling pointer */

La trampa del puntero colgante

Usar un puntero después de liberarlo es un error de uso después de liberar. Puede parecer que funciona y luego corromper los datos o bloquearse de forma impredecible.

Una protección sencilla consiste en establecer el puntero a NULL justo después de liberarlo.

free(a);
a = NULL;   /* now misuse is a clean NULL deref, easier to catch */

Liberar dos veces es indefinido

Llamar dos veces a free sobre el mismo bloque corrompe el estado interno del asignador y suele provocar un bloqueo.

Establecer el puntero a NULL después del primer free ayuda, porque free(NULL) es explícitamente seguro y no hace nada.

free(a);
a = NULL;
free(a);   /* free(NULL) is a harmless no-op */

Libere solo lo que haya reservado con malloc

Pase a free únicamente un puntero obtenido de malloc, calloc o realloc.

Liberar la dirección de una variable de la pila, un literal de cadena o un puntero situado en el interior de un bloque produce un comportamiento indefinido.

int x = 5;
/* free(&x);   WRONG: x is on the stack */
int *p = malloc(sizeof(int));
free(p);        /* correct */

Fuga por un retorno anticipado

Una fuga habitual ocurre cuando reserva memoria y después alcanza una ruta de error que retorna antes de liberarla. El bloque se pierde.

Asegúrese de que toda ruta de salida que sea responsable de la memoria la libere antes.

int *a = malloc(n * sizeof(*a));
if (something_failed) {
    free(a);   /* don't forget this before returning */
    return -1;
}

Un programa limpio de asignación y liberación

Este programa asigna, utiliza y libera la memoria en todas las rutas, sin producir fugas.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int n = 4;
    int *a = malloc(n * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < n; i++) a[i] = i + 1;
    int sum = 0;
    for (int i = 0; i < n; i++) sum += a[i];
    printf("%d\n", sum);
    free(a);
    a = NULL;
    return 0;
}

Liberar asignaciones anidadas

Si un bloque contiene punteros a otros bloques, libere primero los bloques internos y después el externo.

Liberar primero el bloque externo haría que se perdieran las direcciones de los bloques internos y estos quedarían fugados.

for (size_t i = 0; i < rows; i++)
    free(grid[i]);   /* free each row first */
free(grid);          /* then the array of pointers */

Un propietario por bloque

Decida qué parte del código es propietaria de cada asignación y responsable de liberarla.

Si dos punteros son alias del mismo bloque y ambos lo liberan, se produce una doble liberación. Una propiedad clara evita este problema.

Detectar fugas con herramientas

No tiene que encontrar las fugas a simple vista. Herramientas como valgrind o AddressSanitizer informan de fugas y liberaciones no válidas con números de línea.

Compile con -g y ejecute el programa con la herramienta para ver exactamente qué no se liberó.

/* gcc -g -fsanitize=address prog.c && ./a.out */
/* or: valgrind --leak-check=full ./a.out */

Liberar en orden inverso al de configuración

Un hábito fiable: en una función que adquiere varios recursos, libérelos en el orden inverso al que los adquirió.

Esto refleja cómo se construyeron las dependencias y hace que la limpieza sea predecible.

char *buf = malloc(64);
int  *idx = malloc(64 * sizeof(int));
/* ... use them ... */
free(idx);   /* free last-acquired first */
free(buf);

Comprobación rápida

Compruebe su comprensión de la liberación de memoria.

Resumen

Asocie cada asignación con exactamente un free en todas las rutas del código.

Evite los punteros colgantes y las dobles liberaciones estableciendo los punteros a NULL después de liberarlos. Libere las asignaciones anidadas empezando por las internas, asigne un propietario a cada bloque y use valgrind o ASan para detectar fugas. Ahora dispone de todas las herramientas necesarias para trabajar con arrays dinámicos.

Preguntas frecuentes

¿La lección «Liberar memoria y evitar fugas» es gratis?

Sí — el texto completo de «Liberar memoria y evitar 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 «Liberar memoria y evitar fugas»?

Limpie los recursos correctamente 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 4 de 4.

¿Cuánto tiempo toma la lección «Liberar memoria y evitar 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

  1. Asignar un array
  2. Aumentar con realloc
  3. Un tipo de vector reutilizable
  4. Liberar memoria y evitar fugas
← Volver a C Academy