X-Git-Url: https://git.llucax.com/z.facultad/75.00/informe.git/blobdiff_plain/ade63acf6c8d0abf0afa54e1eeb0f4fcc8f514e6..4d68710ea4b4e170388f7437e5853b2cd357e922:/source/dgc.rst 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: