Allocazione Dinamica della Memoria
Elisa Marengo
Universit`a degli Studi di Torino Dipartimento di Informatica
Scelta delle variabili
Quando scriviamo un programma `e fondamentale scegliere le variabili, le strutture dati e il loro tipo in modo adeguato al problema che dobbiamo risolvere.
Ad esempio `e importante capire quando usare una matrice, quando usare un insieme di variabili, quando usare un array...
E importante capire anche quale tipo associare loro.`
Queste decisioni dipendono dall’uso che ne vogliamo fare e dal problema che dobbiamo risolvere.
Allocazione statica
int a [ 5 ] ; int b [ 2 ] [ 3 ] ; c h a r c [ 4 ] ;
Le variabili dichiarate in questo modo non possono variare le loro caratteristiche a tempo di esecuzione.
Ad esempio, non possiamo modificare l’array a a tempo di esecuzione in modo che questo contenga un numero di elementi che non sia 5.
Questa prende il nome diallocazione statica della memoria.
Allocazione Statica
La quantit`a di memoria da allocare `e determinata e fissata a tempo di compilazione.
Allocazione Dinamica
Allocazione Dinamica
Permette di definire variabili che possono essere create o accresciute in fase di esecuzione.
Per allocare memoria in modo dinamico si usa l’operatorenew. Per liberare memoria allocata in modo dinamico si usa l’operatore delete.
Operatori new e new[ ]
Si usano per richiedere una quantit`a di memoria in modo dinamico.
L’operatore new `e seguito da un identificatore di tipo.
Se `e necessario allocare pi`u di un elemento, il numero di elementi da allocare `e indicato tra parentesi quadre.
Restituisce un puntatore all’inizio del blocco di memoria allocato.
t y p e * p o i n t e r = new t y p e ;
t y p e * p o i n t e r = new t y p e [ n _ o f _ e l e m e n t s ];
int * p o i n t e r ;
p o i n t e r = new int[ 5 ] ;
int * p o i n t e r ; int n ;
cin > > n ;
p o i n t e r = new int[ n ];
Il sistema assegna dinamicamente lo spazio per n elementi int;
restituisce il puntatore al primo elemento della sequenza.
Come posso accedere agli elementi dell’array?
Con l’aritmetica dei puntatori Con la notazione a indice
p o i n t e r [ 0 ] ;
* p o i n t e r ; p o i n t e r [ 1 ] ;
*( p o i n t e r + 1 ) ;
int * p o i n t e r ; int n ;
cin > > n ;
p o i n t e r = new int[ n ];
Il sistema assegna dinamicamente lo spazio per n elementi int;
restituisce il puntatore al primo elemento della sequenza.
Come posso accedere agli elementi dell’array?
Con l’aritmetica dei puntatori Con la notazione a indice
p o i n t e r [ 0 ] ;
* p o i n t e r ; p o i n t e r [ 1 ] ;
*( p o i n t e r + 1 ) ;
int * p o i n t e r ; int n ;
cin > > n ;
p o i n t e r = new int[ n ];
Il sistema assegna dinamicamente lo spazio per n elementi int;
restituisce il puntatore al primo elemento della sequenza.
Come posso accedere agli elementi dell’array?
Con l’aritmetica dei puntatori Con la notazione a indice
p o i n t e r [ 0 ] ;
* p o i n t e r ; p o i n t e r [ 1 ] ;
*( p o i n t e r + 1 ) ;
Fallimento dell’allocazione
La memoria dinamica `e allocata in una zona di memoria dettaheap.
La memoria `e una risorsa limitata Potrebbe finire
Deve essere liberata quando non serve pi`u Se l’allocazione fallisce:
Viene lanciata un’eccezione di tipo bad alloc Un’eccezione causa il termine del programma
Esiste un modo per verificare che l’allocazione sia andata a buon fine?
int * p = new int; if (! p ){
// a l l o c a z i o n e f a l l i t a }
Fallimento dell’allocazione
La memoria dinamica `e allocata in una zona di memoria dettaheap.
La memoria `e una risorsa limitata Potrebbe finire
Deve essere liberata quando non serve pi`u Se l’allocazione fallisce:
Viene lanciata un’eccezione di tipo bad alloc Un’eccezione causa il termine del programma
Esiste un modo per verificare che l’allocazione sia andata a buon fine?
int * p = new int; if (! p ){
// a l l o c a z i o n e f a l l i t a }
Fallimento dell’allocazione
La memoria dinamica `e allocata in una zona di memoria dettaheap.
La memoria `e una risorsa limitata Potrebbe finire
Deve essere liberata quando non serve pi`u Se l’allocazione fallisce:
Viene lanciata un’eccezione di tipo bad alloc Un’eccezione causa il termine del programma
Esiste un modo per verificare che l’allocazione sia andata a buon fine?
int * p = new int; if (! p ){
// a l l o c a z i o n e f a l l i t a }
Liberare Memoria: delete, delete[]
L’operatore `e seguito da un puntatore ad un blocco di memoria allocata dinamicamente (quindi allocato con una new oppure un puntatore anull).
delete serve per liberare memoria allocata per un singolo elemento
d e l e t e p o i n t e r ;
delete [] serve per liberare memoria allocata per un array
d e l e t e [] p o i n t e r ;
Errore di programmazione: perdita dei puntatori
Tenere sempre traccia della memoria dinamica utilizzata.
int x =5;
int * p = new int; p =& x ;
Come faccio ad accedere alla memoria dinamica allocata?
E stata allocata una certa quantit`` a di memoria dinamica.
Tale memoria non `e stata deallocata.
Il puntatore a tale memoria`e andato perso: memory leak.
Tale memoria verr`a deallocata solo al termine del programma. Questo potrebbe essere un problema, ad esempio:
se il programma `e scritto per restare in attesa e non terminare.
se si presentano molte situazioni di questo tipo la memoria potrebbe esaurirsi.
Errore di programmazione: perdita dei puntatori
Tenere sempre traccia della memoria dinamica utilizzata.
int x =5;
int * p = new int; p =& x ;
Come faccio ad accedere alla memoria dinamica allocata?
E stata allocata una certa quantit`` a di memoria dinamica.
Tale memoria non `e stata deallocata.
Il puntatore a tale memoria`e andato perso: memory leak.
Tale memoria verr`a deallocata solo al termine del programma. Questo potrebbe essere un problema, ad esempio:
se il programma `e scritto per restare in attesa e non terminare.
se si presentano molte situazioni di questo tipo la memoria potrebbe esaurirsi.