En el lenguaje C, la memoria para las variables se puede asignar en pila (stack) o en montón (heap).
malloc, calloc, realloc, y se libera manualmente a través de free. El volumen de memoria está limitado por las capacidades del sistema, pero el acceso es más lento y la liberación se controla manualmente.Cuándo usar la pila:
Cuándo usar el montón:
// En la pila int arr[10]; // En el montón int* parr = malloc(sizeof(int) * 10); // No olvides liberar la memoria free(parr);
Pregunta: ¿Qué pasará si no se llama a la función free para un arreglo asignado a través de malloc?
Respuesta: Ocurrirá una fuga de memoria (memory leak). La memoria asignada dinámicamente no se liberará automáticamente, y con el tiempo esto puede llevar al agotamiento de la memoria de la aplicación o del sistema entero.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // No hay llamada a free(leakArr), la memoria se pierde }
Historia
En un proyecto, los programadores asignaron memoria para una estructura que describe la sesión del usuario a través de malloc, pero olvidaron llamar a free al terminar de trabajar con la sesión. Como resultado, el proyecto perdía memoria durante varios días, y el servidor "caía" con un error de falta de memoria. El problema se solucionó solo después de perfilar con Valgrind y corregir todos los free omitidos.
Historia
Un desarrollador asignaba un gran arreglo (hasta 10 MB) en la pila para cálculos temporales. En un servidor con un tamaño de pila pequeño, esto llevaba a que la aplicación se cayera con un error de desbordamiento de pila. Después de analizar, se tuvo que mover el buffer al montón.
Historia
Uno de los desarrolladores decidió almacenar cadenas largas en la pila, pero el tamaño de la cadena era subjetivamente especificado por el usuario. Al introducir una cadena muy larga, la aplicación fallaba con un error de acceso a memoria. Finalmente, se decidió mover los datos ingresados al montón con una verificación de longitud.