From 4d68710ea4b4e170388f7437e5853b2cd357e922 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Mon, 15 Jun 2009 18:06:20 -0300 Subject: [PATCH] =?utf8?q?Agregar=20liberaci=C3=B3n=20y=20finalizaci=C3=B3?= =?utf8?q?n=20del=20algoritmo=20actual?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- source/dgc.rst | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/source/dgc.rst b/source/dgc.rst index e12b9df..941a4fd 100644 --- a/source/dgc.rst +++ b/source/dgc.rst @@ -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 `. 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: -- 2.43.0