En el lenguaje C, para la gestión dinámica de la memoria se utilizan funciones de la biblioteca stdlib.h:
malloc(size_t size) — asigna un bloque de memoria de un tamaño determinado. La memoria no está inicializada.calloc(size_t nmemb, size_t size) — asigna un bloque de memoria para un arreglo de nmemb elementos del tamaño dado e inicializa con ceros.realloc(void *ptr, size_t size) — cambia el tamaño de un bloque de memoria previamente asignado.free(void *ptr) — libera un bloque de memoria previamente asignado.Ejemplo de uso:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Manejo del error de asignación de memoria } // ... trabajar con arr ... free(arr);
Es importante siempre verificar el resultado de la asignación de memoria por NULL y no olvidar llamar a free para evitar fugas de memoria.
¿Cuál será el resultado del siguiente código?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Respuesta: La llamada repetida a free para la misma área de memoria conduce a un comportamiento indefinido (undefined behavior). Un mismo puntero solo se puede liberar una vez.
Historia
En un proyecto de automatización de pruebas, hubo interrupciones regulares. El culpable resultó ser un ciclo del sistema, donde después de cada paso olvidaban liberar la memoria asignada a través de
malloc. Como resultado de pruebas prolongadas, el sistema "comía" toda la memoria RAM y se bloqueaba.
Historia
La implementación de un arreglo dinámico utilizaba
realloc, sin verificar el resultado de retorno. En caso de fracaso (realloc retornó NULL), se perdía el puntero a la memoria antigua y ocurría una fuga de memoria. Un intento posterior de trabajar con la memoria resultaba en un segfault.
Historia
Se le encargó a un desarrollador integrar un módulo en C obsoleto, donde la memoria se liberaba a través de
freedos veces consecutivas para un mismo puntero. En la mayoría de los sistemas operativos no aparecían errores, pero en una nueva plataforma la aplicación comenzó a fallar, la causa se descubrió después de mucho tiempo: double-free.