c malloc free dynamic-allocation

c - ¿Debo liberar memoria antes de salir?



malloc free (5)

Depende del sistema operativo. Mejor práctica, diría que debes liberarla explícitamente. También hace que el uso de herramientas como valgrind sea un PITA si no tienes memoria libre por todas partes y no puedo decir qué es bueno y qué es malo, etc.

Si en un sistema operativo que libera memoria explícitamente, todavía tiene el problema de otros recursos. A medida que su aplicación comienza a crecer y atraer bibliotecas de terceros, puede obtener fugas de recursos. Imagine que he escrito una biblioteca que le pide que llame de cerca a un controlador. Este controlador está respaldado por archivos temporales que no se eliminan a menos que llame cerca. O he separado los procesos que se ejecutan en segundo plano que estoy administrando utilizando señales o algún otro recurso que desconoce.

¿Debo liberar toda mi memoria mal asignada cuando salgo del programa debido a un error?

something = (char**) malloc (x * sizeof(char*)); for (i = 0; i < x; i++) something[i] = (char*) malloc (y + 1); ... if (anything == NULL) { printf("Your input is wrong!"); // should I free memory of every mallocated entity now? exit(1); } else { // work with mallocated entities ... free(something); // it must be here system("pause); }


Esta es realmente una pregunta realmente difícil e imponderable.

Pro (a favor de liberar todo antes de salir):

  • sin errores o pérdidas de memoria más tarde si se reordena el código
  • sin falsos positivos de valgrind o verificador de pérdida de memoria
  • no hay pérdidas de memoria si se está ejecutando bajo un sistema operativo defectuoso, o no hay sistema operativo en absoluto

Con (solo salga, no se preocupe por liberar todo):

  • liberar todo puede ser mucho trabajo
  • liberar todo puede introducir errores y fallas
  • su sistema operativo realmente, realmente debería reclamar todos los recursos para usted cuando salga

Al final, tendrá que decidir cuál de estos pros y contras es más importante para usted. Los diferentes programadores en diferentes proyectos en diferentes circunstancias llegarán a diferentes conclusiones; No hay una respuesta única para todos aquí.

Consulte también la pregunta 7.24 en la lista de preguntas frecuentes de C.


No necesita liberar memoria antes de la finalización del programa. Terminar el programa de cualquier manera hace que toda la memoria se desasigne automáticamente.


Siempre debe liberar la memoria asignada antes de salir. Como ya se mencionó en otras respuestas, esto minimizará las advertencias de las herramientas de análisis estático o dinámico, etc.

Pero la verdadera razón por la que siempre debe hacer esto es porque la liberación a menudo expone errores de tiempo de ejecución inactivos en su aplicación.

Si tiene un error en algún lugar que causa daños en la memoria o cambia la dirección del puntero, ese error puede permanecer en silencio y latente. Hasta que cambie algo completamente no relacionado con el error y, por lo tanto, baraje el diseño de la memoria. Luego, de repente, obtienes un bloqueo y no tienes idea de por qué, porque el error ni siquiera se encuentra en el código que acabas de agregar.

Al liberar la memoria, provocas que surjan tales errores. Porque si hay algo mal con el montón o con los punteros apuntando al montón, entonces a menudo se bloqueará en el punto donde llamas free() . Lo que significa que tiene un error grave en algún lugar, que necesita encontrar antes de enviar el programa.


Tuve un escenario completamente opuesto: destruir los destructores de objetos estáticos de la biblioteca de terceros. Solo por liberar explícitamente los grupos de memoria antes de salir. Creo que es mejor ser razonable y concentrarse en la estructura del programa.