Depende de cómo el entorno de tiempo de ejecución que esté utilizando gestione la memoria.
Por ejemplo, en C, debe asignar explícitamente memoria para un nodo llamando a malloc()
, y luego elimina el nodo, debe devolver su memoria a la lista de espacios free()
llamando a free()
. Los datos en el nodo se encuentran donde sea que estén en la memoria hasta que malloc()
reutilice, por lo que puede obtener errores horribles en C al retener un puntero a un nodo después de que lo haya liberado, ya que los datos siguen ahí hasta que de repente no lo es
En los idiomas recolectados de basura, eliminar todas las referencias a un nodo libera automáticamente la memoria cuando se ejecuta el recolector de basura.
- Cómo entender Oracle en la complejidad computacional
- ¿Hay ramas de las matemáticas y las ciencias que no se han descubierto, o hemos agotado todo el conocimiento que requerimos sobre estos dos?
- ¿Cuáles son algunos artículos clásicos sobre teoría de grafos?
- ¿Cuáles son algunas de las ofertas de colocación dadas a los estudiantes de matemáticas de IIT-K? ¿Son equivalentes a los chicos de CS?
- ¿Cuál es una forma intuitiva de entender la solución de programación dinámica ascendente al problema de partición para matrices?
Existen diferentes enfoques para este problema. C # realiza un seguimiento de cuántas referencias existen a un objeto y el GC lo recopila cuando el número es cero. Go utiliza un algoritmo de marca / barrido, donde establece un bit en cada objeto en el montón al que puede navegar desde la raíz, y luego recoge cada objeto en el montón cuyo bit no se configuró. (En ambos casos, nada puede asignar nueva memoria mientras se ejecuta el GC, y el tiempo de ejecución esencialmente detiene el programa mientras está limpiando la casa. La recolección de basura de todo el mundo es la razón por la cual los sistemas en tiempo real generalmente todavía se escriben en C.)
En cualquier caso, el GC pasa por el montón y devuelve todo lo que se recopila a la lista de espacio libre. Tal vez incluso compacta el montón, moviendo bloques de memoria usada alrededor para que más espacio libre sea contiguo.
Entonces, en un lenguaje GC, eliminas un nodo de la lista haciendo que nada lo señale más. Por lo general, esto se parece a n.prev.next = n.next
. Antes de esta operación, lo único que apuntaba a n
era n.prev.next
; Después de esta operación, nada lo hace. (De acuerdo, eso no es cierto. n
todavía apunta a la memoria. Pero cuando n
sale del alcance al final del método, entonces nada lo señalará). La próxima vez que se ejecute el GC, encontrará que nada apunta al memoria a la que n
solía señalar (ya sea porque la fase de marcado no lo marcó o porque su recuento de referencia fue a 0), y coloca el bloque de memoria que solía contener n
en la lista de espacio libre.
En C, después de hacer n.prev.next = n.next
, debe llamar free(n)
o tendrá lo que se conoce como pérdida de memoria. Su programa agregará nodos a la lista y los eliminará, pero al eliminarlos no se agregarán nodos eliminados a la lista de espacios libres y, finalmente, el programa se quedará sin memoria libre.