• Non ci sono risultati.

ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++ Gianfranco Ciaschetti

N/A
N/A
Protected

Academic year: 2022

Condividi "ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++ Gianfranco Ciaschetti"

Copied!
22
0
0

Testo completo

(1)

ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++

Gianfranco Ciaschetti

(2)

Permette di allocare memoria «quando ce n’è bisogno», con un’istruzione e non con una dichiarazione

Riserva spazio di memoria «senza un nome» ma se ne conosce l’indirizzo

Riserva spazio nella memoria heap e non nello stack

La memoria allocata dinamicamente resta allocata fino a che non viene esplicitamente deallocata con un’apposita istruzione

Si usa l’operatore «freccia» anziché l’operatore «punto» per accedere ai campi di un record dinamico

ALLOCAZIONE DINAMICA DELLA MEMORIA

(3)

istruzioni del linguaggio C ALLOCAZIONE DINAMICA

malloc calloc realloc

void* malloc (size_t n);

void* calloc (size_t b, size_t n);

void* realloc(void* p, size_t n);

(4)

istruzioni del linguaggio C

DEALLOCAZIONE DINAMICA

free

void free (void *);

(5)

malloc : alloca memoria senza inizializzazione ALLOCAZIONE DINAMICA

void* malloc (size_t n);

ESEMPIO: alloca spazio per un intero e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) malloc (sizeof(int));

(6)

ALLOCAZIONE DINAMICA

ESEMPIO: alloca spazio per 100 interi e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) malloc (1oo*sizeof(int));

cin >> *p; // input di p[0]

ESEMPIO: alloca spazio per 20 reali in singola precisione e memorizza in f l’indirizzo della memoria allocata

float *f;

f = (float*) malloc (2o*sizeof(float));

*(f+2) = 3.14; // assegna valore a f[2]

malloc : alloca memoria senza inizializzazione

(7)

ESEMPIO: alloca spazio per una stringa di 20 caratteri char *s;

s = (char*) malloc (20*sizeof(char));

cin >> s; // inserisci stringa nella memoria dinamica

ALLOCAZIONE DINAMICA

malloc : alloca memoria senza inizializzazione

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = (cane*)malloc(sizeof(cane));

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

(8)

ESEMPIO: alloca un vettore di N elementi int N, *vet;

cout << "quanti elementi?";

cin >> N;

vet = (int*)malloc(N*sizeof(int)); // possibile solo a RUNTIME ...

free(vet);

ALLOCAZIONE DINAMICA

vettore dinamico con malloc

(9)

void free (void *);

ESEMPIO: dealloca spazio precedentemente allocato int *p = (int*)malloc(sizeof(int));

...

free(p);

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO: dealloca spazio precedentemente allocato float *f;

f = (float*)malloc(sizeof(float));

...

free(f);

(10)

ESEMPIO: dealloca spazio precedentemente allocato char *s;

s = (char*)malloc(20);

...

free(s);

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO: dealloca spazio precedentemente allocato struct cane {...};

cane *c = (cane*)malloc(sizeof(cane));

...

free(c);

(11)

calloc : alloca memoria con inizializzazione ALLOCAZIONE DINAMICA

void* calloc (size_t b, size_t n);

ESEMPIO: alloca spazio per un intero e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) calloc (1, sizeof(int)); // *p = 0

(12)

ALLOCAZIONE DINAMICA

ESEMPIO: alloca spazio per 100 interi e memorizza in p l’indirizzo della memoria allocata int *p;

p = (int*) calloc (1oo,sizeof(int)); // *p=0; *(p+1)=0; ...

ESEMPIO: alloca spazio per 20 reali in singola precisione e memorizza in f l’indirizzo della memoria allocata

float *f;

p = (float*) calloc (20,sizeof(float)); // *f=0; *(f+1)=0; ...

calloc : alloca memoria con inizializzazione

(13)

ESEMPIO: alloca spazio per una stringa di 20 caratteri char *s;

s = (char*) calloc (20,sizeof(char)); // s = ""

ALLOCAZIONE DINAMICA

calloc : alloca memoria con inizializzazione

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = (cane*)calloc(1,sizeof(cane));

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

(14)

ESEMPIO: alloca un vettore di N elementi int i, N, *vet;

cout << "quanti elementi?";

cin >> N;

vet = (int*)calloc(N,sizeof(int)); // possibile solo a RUNTIME for(i=0; i<N; i++)

cout << vet[i] << endl; // visualizza N valori nulli

ALLOCAZIONE DINAMICA

vettore dinamico con calloc

(15)

void free (void *);

COME PER MALLOC!

DEALLOCAZIONE DINAMICA

free : dealloca memoria precedentemente allocata

ESEMPIO:

float *f;

f = (float*)calloc(1,sizeof(float));

...

free(f);

(16)

realloc : rialloca memoria senza inizializzazione RIALLOCAZIONE DINAMICA

void* realloc (void* p, size_t n);

ESEMPIO: rialloca spazio per due interi int *p;

p = (int*) malloc (sizeof(int)); // *p memorizza un intero ...

p = (int*)realloc(p, 2*sizeof(int));

// *p e *(p+1) memorizzano interi

(17)

realloc : rialloca memoria senza inizializzazione RIALLOCAZIONE DINAMICA

ESEMPIO: rialloca spazio per due interi int *p;

p = (int*) malloc (sizeof(int)); // *p memorizza un intero

*p = 3;

p = (int*)realloc(p, 2*sizeof(int));

// *p e *(p+1) memorizzano interi ma solo p ha un valore p[1] = 5;

cout << p[0]; // visualizza 3 cout << p[1]; // visualizza 5

(18)

ridimensionamento di un vettore con realloc RIALLOCAZIONE DINAMICA

ESEMPIO: ampliare la dimensione di un array dinamico int *vet, N;

cout << "quanti elementi?";

cin >> N;

p = (int*) malloc (N*sizeof(int));

...

cout << "quanti elementi aggiungere?";

cin >> N2;

p = (int*)realloc(p, (N+N2)*sizeof(int));

// i primi N sono come prima

(19)

istruzioni del linguaggio C++

ALLOCAZIONE e DEALLOCAZIONE DINAMICA

new delete

void* new data_type;

void delete pointer;

(20)

ESEMPIO: alloca spazio per un intero e memorizza in p l’indirizzo della memoria allocata int *p;

p = new int; // alloca memoria per un intero ...

delete p;

ALLOCAZIONE e DEALLOCAZIONE DINAMICA

in C++

(21)

ALLOCAZIONE e DEALLOCAZIONE DINAMICA in C++

ESEMPIO: alloca spazio per 20 interi e memorizza in p l’indirizzo della memoria allocata int *vet;

vet = new int[20]; // alloca memoria per un vettore ...

delete vet;

(22)

ALLOCAZIONE e DEALLOCAZIONE DINAMICA in C++

ESEMPIO: alloca un record di tipo cane struct cane {

char nome[20];

char razza[20];

int eta;

};

cane *c = new cane;

cin >> c->nome;

cin >> c->razza;

cin >> c->eta;

...

delete c;

Riferimenti

Documenti correlati

Un approccio più efficiente dal punto di vista dell'utilizzazione della risorsa memoria sarebbe quello di utilizzare sempre un vettore formato da un numero di elementi

memory leak: perdiamo riferimenti ad aree di memoria che ci sono state attribuite, ma non vengono

• È possibile definire un nuovo tipo a partire da una struct tramite la direttiva typedef. • Passabili

Se P è la percentuale dello spazio di memoria virtuale occupato dalla tabella di gestione delle pagine, si calcoli l’ampiezza A della porzione di tabella ospitabile in

– Un processo può accedere memoria solo tra la base e il limite della partizione a esso assegnata. – Valore base aggiunto al valore di ogni indirizzo riferito (operazione costosa)

Accanto ai depositi stabili e attendibili della memoria a lungo termine, la memoria di lavoro, in passato chiamata memoria a breve termine, è uno spazio di manovra in grado

–  Allocazione della memoria ai singoli job –  Protezione dello spazio di indirizzamento –  Condivisione dello spazio di indirizzamento –  Gestione dello swap.. • 

• La garbage collection è una modalità automatica di gestione della memoria, mediante la quale il sistema operativo, o il compilatore e un modulo di run-time, liberano le porzioni