next up previous contents
Next: Asignari Up: Date Previous: Conversii   Cuprins

Valori memorii

Memoriile sunt valori care aloca spatiu dinamic pentru a referi variabile. Exista 2 tipuri de valori:

Memoriile se gestioneaza special deoarece si ele pot fi valori ale variabilelor si deoarce, pentru a schimba valorile variabilelor e nevoie de modificarea pointerilor spre variabile, deci e nevoie de referinte la acesti pointeri, altfel spus de referinte la variabile. Daca o astfel de referinta pointeaza intr-o memorie in sensul de mai sus, si memoria e valoare a unei variabile, si daca variabila respectiva ajunge sa aiba numarul de referinte zero, deci se elibereaza, si daca valoarea ei (memoria) ajunge cu numarul de referinte zero si se elibereaza, referinta de la inceput va deveni invalida, fara ca acest lucru sa se observe. E cazul clasica al efectelor laterale in atribuiri:
\begin{lstlisting}[language=plint]
new x[1];
x[1] = { x = 3; }
\end{lstlisting}

In acest exemplu, prima atribuire se amana pe mai tarziu, pana dupa ce valoarea returnata de blocul din dreapta va fi fost calculata. Se salveaza deci referinta la x[1], sa zicem &x[1], se intra in blocul din dreapta si se elibereaza memoria valoarea a lui x, in care &x[1] este o referinta, pentru a i se atribuie lui x o valoare scalara, devenind intregul 3. Pointerul &x[1] va fi invalid.

De aceea, solutia este ca inainte de a intra in blocul din dreapta, sa se salveze memoriile (incrementeze numarul de referinte a valorilor) tuturor referintelor din lista din stanga simbolului de atribuire. La iesirea din bloc, se va efectua o asignare la referinta, dupa care se va elibera memoria; aceasta insa va avea numarul de referinte zero, fiind deci silentios eliberata.

Ca si consecinta, efectele laterale sunt bine suportate in plint, efectul lor negativ fiind doar atribuiri fara sens.


next up previous contents
Next: Asignari Up: Date Previous: Conversii   Cuprins
Sebastian Glita 2002-06-19