]> git.llucax.com Git - z.facultad/75.00/informe.git/blobdiff - source/dgc.rst
Agregar liberación y finalización del algoritmo actual
[z.facultad/75.00/informe.git] / source / dgc.rst
index e12b9df5354a62affb39c9e79dea9bdf3003d85d..941a4fd1419451af34d0f530bac3e5f7a73d7f6b 100644 (file)
@@ -743,6 +743,47 @@ suficientes como para almacenar el objeto grande y si esto falla el error se
 propaga hasta la función ``new()`` que lanza una excepción.
 
 
+.. _dgc_algo_free:
+
+Liberación de memoria
+^^^^^^^^^^^^^^^^^^^^^
+La liberación de la memoria asignada puede hacerse explícitamente. Esto
+saltéa el mecanismo de recolección, y es utilizado para dar soporte a menejo
+explícito de memoria asignada en el *heap* del recolector. En general el
+usuario no debe utilizar liberación explícita, pero puede ser útil en casos
+muy particulares::
+
+   function delete(pointer) is
+      [pool, page, block_start] = find_block(pointer)
+      if block is not null
+         block.free = true
+         block.final = false
+         block.noscan = false
+         if page.block_size is PAGE // objeto grande
+            free_big_object(pool, page)
+         else // objeto pequeño
+            free_lists[page.block_size].link(block)
+
+Como se puede observar, si el objeto es pequeño se enlaza a la lista de libres
+correspondiente y si es grande se liberan todas las páginas asociadas a éste,
+de forma similar a la :ref:`fase de barrido <dgc_algo_sweep>`. A diferencia de
+ésta, no se finaliza el objeto (es decir, no se llama a su destructor).
+
+
+.. _dgc_algo_final:
+
+Finalización
+^^^^^^^^^^^^
+Al finalizar el programa, el recolector es finalizado también y lo que realiza
+actualmente, además de liberar la memoria propia del recolector, es realizar
+una recolección. Es decir, si hay objetos que son todavía alcanzables desde el
+*root set*, esos objetos no son finalizados (y por lo tanto sus destructores
+no son ejecutados).
+
+Como se ha visto, esto es perfectamente válido ya que D_ no garantiza que los
+objetos sean finalizados.
+
+
 
 .. _dgc_impl: