next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Referencias simbólicas Sup: Referencias Ant: Ejercicio: Indentificadores entre LLaves Err: Si hallas una errata ...

Gestión de la memoria

En Perl, una variable representa una ligadura lógica entre un nombre y un valor.

Del mismo modo, un array es una colección de ligaduras lógicas a valores escalares. Véase la figura 5.1

Figura 5.1: Un array es una colección de ligaduras lógicas a valores escalares
\begin{figure}\centerline{\epsfig{file=array_view.eps, height=6cm}}\end{figure}

Perl mantiene un contador de referencias para cada valor existente en el programa. Este contador se incrementa tanto si es usado directamente mediante un nombre de variable como a través de una referencia. En todo momento el contador de referencia del valor asociado con una variable $a mantiene el número de referencias existentes a dicha valor. Puesto que hay una ligadura entre la variable $a, u valor, este contador es al menos uno. Véase la figura 5.2. Si este contador desciende hasta cero, Perl elimina la memoria asignada a ese valor. Los contadores descienden por diversas razones. Por ejemplo, cada vez que termina un bloque, el contador de los valores asociados con las variables declaradas en ese bloque desciende una unidad. En el caso habitual de que el contador valiera 1, pasará a valer 0 y la memoria asociada con el valor será liberada.

Figura 5.2: Contadores de referencia y asignaciones
\begin{figure}\centerline{\epsfig{file=with_counts.ps, height =8cm}}\end{figure}

Existe un problema con este algoritmo de recolección de basura: las referencias circulares. En esos casos el programador debe actuar usando, por ejemplo, el operador delete.

El siguiente ejemplo muestra como los elementos de un array tienen sus propios contadores de referencias:

DB<1> @a = 1..5
DB<2> $ra = \$a[4]
DB<3> pop @a
DB<4> p @a
1234
DB<5> p $$ra
5
la orden pop @a rompe la ligadura entre $a[4] y el valor, esto es, la ligadura-variable $a[4] es eliminada del array. Sin embargo el valor asociado no es eliminado de memoria ya que su contador de referencias todavía no es cero. La variable $ra aún esta referenciándolo.


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: Referencias simbólicas Sup: Referencias Ant: Ejercicio: Indentificadores entre LLaves Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21