Molte persone sembrano avere l'impressione che una volta liberata la memoria, venga immediatamente restituita al sistema operativo e possa essere utilizzata da altri programmi.
Questo non è vero. I sistemi operativi gestiscono comunemente la memoria in pagine 4KiB. malloc
e altri tipi di gestione della memoria ottengono le pagine dal sistema operativo e le gestiscono in modo ottimale. E 'molto probabile che free()
sarà non tornare pagine al sistema operativo, in base al presupposto che il programma sarà malloc più memoria in seguito.
Non sto dicendo che free()
non restituisce mai memoria al sistema operativo. Può succedere, in particolare se stai liberando grandi tratti di memoria. Ma non c'è garanzia.
Il fatto importante: se non si libera la memoria non più necessaria, si garantisce che ulteriori malloc consumeranno ancora più memoria. Ma se prima liberate, malloc potrebbe riutilizzare invece la memoria liberata.
Cosa significa in pratica? Significa che se sai che il tuo programma non richiederà più memoria d'ora in poi (ad esempio è in fase di pulizia), liberare memoria non è così importante. Tuttavia, se il programma potrebbe allocare più memoria in un secondo momento, è necessario evitare perdite di memoria, in particolare quelle che possono verificarsi ripetutamente.
Vedi anche questo commento per maggiori dettagli sul perché liberare memoria appena prima della terminazione è un male.
Un commentatore non sembra aver capito che la chiamata free()
non consente automaticamente ad altri programmi di utilizzare la memoria liberata. Ma questo è il punto centrale di questa risposta!
Quindi, per convincere le persone, mostrerò un esempio in cui free () fa ben poco. Per rendere la matematica facile da seguire, farò finta che il sistema operativo gestisca la memoria in pagine da 4000 byte.
Supponiamo di assegnare diecimila blocchi da 100 byte (per semplicità ignorerò la memoria aggiuntiva che sarebbe necessaria per gestire queste allocazioni). Ciò richiede 1 MB o 250 pagine. Se poi libera 9000 di questi blocchi in modo casuale, ti restano solo 1000 blocchi, ma sono sparsi ovunque. Statisticamente, circa 5 delle pagine saranno vuote. Gli altri 245 avranno ciascuno almeno un blocco allocato in essi. Ciò equivale a 980 KB di memoria, che non può essere recuperato dal sistema operativo, anche se ora sono stati allocati solo 100 KB!
D'altra parte, ora puoi malloc () 9000 blocchi in più senza aumentare la quantità di memoria che il tuo programma sta legando.
Anche quando tecnicamentefree()
potrebbe restituire memoria al sistema operativo, potrebbe non farlo. deve raggiungere un equilibrio tra il funzionamento rapido e il risparmio di memoria. Inoltre, è probabile che un programma che ha già allocato molta memoria e quindi liberato lo faccia di nuovo. Un server Web deve gestire la richiesta dopo la richiesta dopo la richiesta - ha senso mantenere un po 'di memoria "allentata" disponibile, quindi non è necessario richiedere continuamente memoria al sistema operativo.free()