Este es un inconveniente importante del tradicional reference counting garbage collection. La propiedad de un recolector de basura que describe este comportamiento es un recolector incompleto. Otros colectores entran en gran parte en una categoría llamada que rastrea los recolectores de basura, que incluyen híbridos tradicionales de barrido de marca, semi-espacio/compactación e híbridos generacionales, y no sufren estos inconvenientes (pero se enfrentan a muchos otros).
Todas las implementaciones de JVM y CLI que conozco usan colectores completos, lo que significa que no sufren el problema específico que usted está preguntando aquí. Que yo sepa, de esos Jikes RVM es el único que suministra un colector de recuento de referencia (uno de los muchos).
Otra cosa interesante a tener en cuenta es que hay soluciones para el problema de completitud en el conteo de referencias de recolección de basura, y el resulting collectors muestra algunas propiedades de rendimiento interesantes que son difíciles de eliminar de los colectores. Desafortunadamente, los algoritmos de recolección de basura de mayor rendimiento y las modificaciones más completas dependen de la asistencia del compilador, por lo que llevarlos a C++ 's shared_ptr<T>
es difícil/no ocurre. En cambio, tenemos weak_ptr<T>
y documented rules (disculpe el vínculo subóptimo, aparentemente la documentación se me escapa) acerca de simplemente evitar los problemas. Este isn't the first time (otro enlace mediocre) que hemos visto este enfoque, y la esperanza es el trabajo extra para evitar problemas de memoria es menor que la cantidad de trabajo necesario para mantener el código que no utiliza shared_ptr<T>
, etc.
El los enlaces mediocres se deben a que gran parte de mi material de referencia está disperso en notas de la clase de gestión de memoria del último semestre.
De hecho, este es uno de los problemas con los entornos de conteo de referencias que ** se ocupa ** en .NET GC. –
Otra característica tradicional de Lisp que se abre camino en los entornos principales. –