4° Anno TEORIA 2. Allocazione dinamica della memoria | Page 12

10 : Allocazione dinamica della memoria Vers . 8.3 – Ottobre 2023
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