Nel linguaggio C, la memoria per le variabili può essere allocata sia nello stack che nell'heap.
malloc, calloc, realloc, e deve essere liberata manualmente tramite free. La quantità di memoria è limitata dalle capacità del sistema, ma l'accesso è più lento e il rilascio deve essere controllato manualmente.Quando usare lo stack:
Quando usare l'heap:
// Nello stack int arr[10]; // Nell'heap int* parr = malloc(sizeof(int) * 10); // Non dimenticare di liberare la memoria free(parr);
Perdona: Cosa succede se a un array allocato tramite malloc non viene chiamata la funzione free?
Risposta: Si verifica una perdita di memoria (memory leak). La memoria allocata dinamicamente non verrà liberata automaticamente e, col passare del tempo, questo può portare ad esaurire la memoria dell'applicazione o dell'intero sistema.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // Nessuna chiamata a free(leakArr), la memoria viene persa }
Storia
In un progetto, i programmatori allocavano memoria per una struttura che descriveva la sessione utente tramite malloc, ma si dimenticavano di chiamare free al termine del lavoro con la sessione. Di conseguenza, il progetto perdeva memoria per diversi giorni, e il server "crashava" con un errore di mancanza di memoria. Il problema è stato risolto solo dopo il profiling con Valgrind e la correzione di tutte le chiamate free mancanti.
Storia
Un sviluppatore ha allocato un grande array (fino a 10 MB) nello stack per calcoli temporanei. Su un server con una piccola dimensione dello stack, questo portava a un crash dell'applicazione con un errore di overflow dello stack. Dopo un'analisi, si è reso necessario spostare il buffer nell'heap.
Storia
Uno degli sviluppatori ha deciso di memorizzare lunghe stringhe nello stack, ma la dimensione della stringa era soggettivamente determinata dall'utente. Quando veniva inserita una stringa molto lunga, l'applicazione crashava con un errore di accesso alla memoria. Alla fine, è stata presa la decisione di spostare i dati inseriti nell'heap con un controllo della lunghezza.