10: Allocazione dinamica della memoria Vers. 9.1 – Ottobre 2025
GARBAGE COLLECTION ed ALIASING: SIDE EFFECT E DANGLING REFERENCE
Uno dei problemi principali quando si utilizza l’ allocazione dinamica è quello della deallocazione delle vecchie zone di memoria allocate( chiamata garbage collection lett. raccolta dei rifiuti).
Per recuperare il garbage( garbage collection) esistono due modalità:
(*) modalità manuale( a carico del programmatore) con opportune istruzioni del programma( ad esempio la procedura Dealloca());
(*) modalità automatica( a carico del sistema operativo) che periodicamente pulisce la memoria dai dati inutilizzata grazie ad un programma( garbage collector) che si occupa di recuperare locazioni oramai inaccessibili liberando porzioni di memoria dello heap.
Il fenomeno dell’ ALIASING si ha quando un puntatore può essere creato come sostituto( alias) di un altro ossia quando entrambi puntano alla stessa locazione di memoria allocata sia staicamente sia dinamicamente( n. b. basta assegnare ad un puntatore il valore dell’ altro)
Tale fenomeno, perfettamente lecito ed estremamente utile, può dare origine a gravi effetti collaterali( SIDE EFFECT) in grado di bloccare l’ esecuzione del programma( abend o crash) causati da un programmatore poco " attento ".
Ad esempio è possibile avere zone di memoria allocate dinamicamente che diventano inaccessibili( ossia allocate in memoria ma mai deallocate) non solo per la mancata deallocazione del programmatore, ma per l’ esecuzione di istruzioni particolari( vedi aliasing) che finiscono per avere un effetto collaterale( side effect) non previsto.
Esempio 4: Effetto collaterale ALIASING
ALGORITMO Esempio _ 4 _ Dangling _ Reference PROCEDURA main() p, q: PUNTATORE A INT INIZIO Alloca( p, DimensioneDi( INT))( 1)
SE( p ≠ NULL)
ALLORA q � p( 2) // ALIASING......... Dealloca( p)( 3) // Attenzione al terribile SIDE EFFECT // ORA la zona puntata da q non è più accessibile // ed il puntatore q è comunque“ referenziato” // DANGLING REFERENCE
ALTRIMENTI
Scrivi(" Allocazione non riuscita!") FINE SE
FINE
???
100 101 102 103
4 byte
( 3)( 1)( 2)
100 100 p q
Segmento HEAP
( 3)
Segmento STACK
Segmento Dati
Segmento Codice
Autore: Rio Chierego( email: riochierego @ libero. it- sito web: www. riochierego. it) Pag. 12