ProgramaciónDesarrollador C

Describe el mecanismo de trabajo de la asignación y liberación dinámica de memoria en C, las funciones principales (malloc, calloc, realloc, free) y los errores comunes en su uso.

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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.

Pregunta capciosa

¿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.

Ejemplos de errores reales debido a la falta de conocimiento de los matices del tema


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 free dos 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.