• Non ci sono risultati.

Allocazione Dinamica della Memoria

N/A
N/A
Protected

Academic year: 2022

Condividi "Allocazione Dinamica della Memoria"

Copied!
15
0
0

Testo completo

(1)

Allocazione Dinamica della Memoria

Elisa Marengo

Universit`a degli Studi di Torino Dipartimento di Informatica

(2)

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.

(3)

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.

(4)

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.

(5)

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 ] ;

(6)

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 ) ;

(7)

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 ) ;

(8)

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 ) ;

(9)

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 }

(10)

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 }

(11)

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 }

(12)

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 ;

(13)

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.

(14)

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.

(15)

Esempio

Esempio

Riferimenti

Documenti correlati

[r]

[r]

[r]

la quantità di memoria puntata da ptr, effettuando una nuova allocazione e spostando size byte da ptr al nuovo buffer allocato. Il buffer puntato da ptr viene liberato

[r]

L’allocazione dinamica della memoria si verifica quando un programma richiede al sistema operativo un blocco di memoria dichiarando, preventivamente, la dimensione dello stesso..

- La prima tabella (tabella 4) “ Dimensione campionaria complessiva e sua sensibilità alla variazione del 10% della precisione desiderata” fornisce la dimensione campionaria

[r]