Esto ha sido algo que me ha molestado por años.
A todos nos enseñan en la escuela (al menos, yo era) que DEBES liberar cada puntero asignado. Sin embargo, tengo un poco de curiosidad sobre el costo real de no liberar memoria. En algunos casos obvios, como cuando malloc
se llama dentro de un bucle o parte de una ejecución de subproceso, es muy importante liberar para que no haya pérdidas de memoria. Pero considere los siguientes dos ejemplos:
Primero, si tengo código, es algo como esto:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
¿Cuál es el resultado real aquí? Mi opinión es que el proceso muere y luego el espacio de almacenamiento dinámico desaparece de todos modos, por lo que no hay nada de malo en perder la llamada free
(sin embargo, reconozco la importancia de tenerlo de todos modos para el cierre, la mantenibilidad y las buenas prácticas). ¿Estoy en lo cierto en este pensamiento?
Segundo, digamos que tengo un programa que actúa un poco como un shell. Los usuarios pueden declarar variables como aaa = 123
y se almacenan en alguna estructura de datos dinámicos para su uso posterior. Claramente, parece obvio que usaría alguna solución que invocará alguna función * alloc (hashmap, lista vinculada, algo así). Para este tipo de programa, no tiene sentido liberarse nunca después de llamar malloc
porque estas variables deben estar presentes en todo momento durante la ejecución del programa y no hay una buena manera (que pueda ver) de implementar esto con espacio estáticamente asignado. ¿Es un mal diseño tener un montón de memoria asignada pero solo liberada como parte del final del proceso? Si es así, ¿cuál es la alternativa?
free(a)
realidad no hace nada para liberar memoria! Simplemente restablece algunos punteros en la implementación libc de malloc que realizan un seguimiento de los fragmentos de memoria disponibles dentro de una gran página de memoria mmapped (comúnmente llamada el "montón"). Esa página solo se liberará cuando finalice su programa, no antes.