¿Por qué en idiomas con administración automática de memoria, la administración manual no está permitida? Puedo ver que en la mayoría de los casos no sería necesario, pero ¿no sería útil cuando tienes poco memoria y no quieres confiar en que el GC sea inteligente?
En la gran mayoría de las lenguas de basura recogida y máquinas virtuales que no tiene sentido para ofrecer una función free
aunque casi siempre se puede utilizar la FFI para asignar y memoria no administrada libre fuera de la máquina virtual gestionado si así lo desea.
Hay dos razones principales por las free
está ausente de idiomas recogida de basura: la seguridad
- memoria.
- Sin punteros.
En cuanto a la seguridad de la memoria, una de las principales motivaciones detrás de la administración automática de la memoria es eliminar la clase de errores causados por la administración incorrecta de la memoria manual. Por ejemplo, con la gestión manual de la memoria llamar al free
con el mismo puntero dos veces o con un puntero incorrecto puede dañar las propias estructuras de datos del administrador de memoria y causar bloqueos no determinísticos en el programa (cuando el administrador de memoria alcance sus datos dañados). Esto no puede suceder con la gestión automática de la memoria, pero al exponer free
se abriría nuevamente esta lata de gusanos.
En cuanto a los punteros, la función free
libera un bloque de memoria asignada en una ubicación especificada por un puntero al administrador de memoria. Los lenguajes y máquinas virtuales recolectados de basura reemplazan los punteros con un concepto más abstracto llamado referencias.La mayoría de los GC de producción se mueven, lo que significa que el código de alto nivel hace referencia a un valor u objeto, pero la ubicación subyacente en la memoria puede cambiar ya que la VM es capaz de mover bloques de memoria asignados sin el conocimiento del lenguaje de alto nivel. Esto se usa para compactar el montón, prevenir la fragmentación y mejorar la localidad.
Así que hay buenas razones para no tener free
cuando tiene un GC.
Esta es una buena descripción de la seguridad de la memoria que menciono en mi respuesta. Gracias. – Novelocrat
Acepté esta respuesta, ya que proporciona un caso sólido en el que la función manual free() podría interferir con el _trabajo_ de un GC. Las otras respuestas, hasta donde yo entiendo, dan solo las formas en que free() va en contra del _intent_ de tener un GC. – sundar
@sundar, gracias. En realidad, nunca consideré la seguridad del tipo de cumplimiento de GC hasta que leí algo al respecto en una presentación sobre D. – MSN