Tipi di Allocazione della Memoria
Nel linguaggio C, l’allocazione della memoria può essere suddivisa in tre categorie principali:
-
Allocazione Statica:
- Le variabili globali e statiche vengono allocate nel segmento dati quando il programma viene caricato in memoria e rimangono allocate per tutta la durata dell’esecuzione del programma.
-
Allocazione Automatica:
- Le variabili locali e gli argomenti delle funzioni vengono allocate nello stack. Lo spazio viene creato all’ingresso di una funzione e liberato automaticamente all’uscita.
-
Allocazione Dinamica:
- Questo tipo di allocazione utilizza l’heap (o free store) per gestire la memoria durante l’esecuzione del programma. È necessario gestirla manualmente tramite funzioni della libreria standard come
malloc
,calloc
,realloc
efree
.
- Questo tipo di allocazione utilizza l’heap (o free store) per gestire la memoria durante l’esecuzione del programma. È necessario gestirla manualmente tramite funzioni della libreria standard come
Funzioni per l’Allocazione Dinamica
-
malloc
- Prototipo:
void* malloc(size_t size);
- Alloca un blocco di memoria contiguo di dimensione specificata in byte.
- Restituisce un puntatore generico (
void*
) che deve essere convertito al tipo desiderato. - Se l’allocazione fallisce, restituisce
NULL
. - Esempio:
- Prototipo:
-
calloc
- Prototipo:
void* calloc(size_t num, size_t size);
- Alloca memoria per un numero specificato di elementi e la inizializza a zero.
- Esempio:
- Prototipo:
-
realloc
- Prototipo:
void* realloc(void* ptr, size_t size);
- Ridimensiona un blocco di memoria precedentemente allocato con
malloc
ocalloc
. - Può spostare il contenuto in un nuovo blocco se non c’è spazio contiguo sufficiente.
- Esempio:
- Prototipo:
-
free
- Prototipo:
void free(void* ptr);
- Libera la memoria precedentemente allocata con
malloc
,calloc
orealloc
. - È essenziale per evitare perdite di memoria.
- Esempio:
- Prototipo:
Allocazione Dinamica di Strutture Complesse
-
Array Monodimensionali:
- Esempio:
-
Array Multidimensionali:
- Primo metodo:
- Secondo metodo (blocco unico):
Vantaggi e Svantaggi dell’Allocazione Dinamica
-
Vantaggi:
- Permette una gestione flessibile della memoria.
- Ideale per strutture di dati dinamiche come liste, alberi e grafi.
-
Svantaggi:
- Richiede una gestione esplicita della memoria.
- Errori comuni includono perdite di memoria (memory leaks) e accessi a memoria non valida (dangling pointers).
Best Practices
- Inizializzare sempre i puntatori a
NULL
. - Verificare il successo dell’allocazione prima di utilizzare la memoria.
- Liberare la memoria appena non è più necessaria.
- Evitare doppi
free
, che possono causare comportamenti indefiniti.
Domande Potenziali
- Quali sono le principali differenze tra allocazione statica, automatica e dinamica?
- Come funziona la funzione
malloc
e perché è necessario usaresizeof
? - Qual è la differenza tra
malloc
ecalloc
? - Quando si usa
realloc
e quali sono i possibili rischi? - Quali sono le implicazioni di una mancata chiamata a
free
su un blocco di memoria? - Come si alloca dinamicamente un array bidimensionale e quali sono le differenze tra i diversi approcci?
- Che cosa sono i dangling pointers e come si possono evitare?
- Quali sono i rischi associati alla gestione manuale della memoria e come possono essere mitigati?