ALLOCAZIONE DINAMICA DELLA MEMORIA in C e C++
Gianfranco Ciaschetti
• 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
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);
istruzioni del linguaggio C
DEALLOCAZIONE DINAMICA
free
void free (void *);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));
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
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;
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
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);
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);
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
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
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;
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
void free (void *);
COME PER MALLOC!
DEALLOCAZIONE DINAMICA
free : dealloca memoria precedentemente allocata
ESEMPIO:
float *f;
f = (float*)calloc(1,sizeof(float));
...
free(f);
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
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
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
istruzioni del linguaggio C++
ALLOCAZIONE e DEALLOCAZIONE DINAMICA
new delete
void* new data_type;
void delete pointer;
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++
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;
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;