Questo è stato qualcosa che mi ha infastidito per secoli.
A scuola ci viene insegnato (almeno lo ero) che DEVI liberare ogni puntatore assegnato. Sono un po 'curioso, però, del costo reale di non liberare memoria. In alcuni casi ovvi, come quando malloc
viene chiamato all'interno di un ciclo o parte dell'esecuzione di un thread, è molto importante liberarsi, quindi non ci sono perdite di memoria. Ma considera i seguenti due esempi:
Innanzitutto, se ho un codice simile a questo:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Qual è il vero risultato qui? Il mio pensiero è che il processo muoia e quindi lo spazio dell'heap è andato comunque, quindi non c'è nulla di male nel perdere la chiamata free
(tuttavia, riconosco l'importanza di averlo comunque per la chiusura, la manutenibilità e le buone pratiche). Ho ragione in questo pensiero?
Secondo, diciamo che ho un programma che si comporta un po 'come una shell. Gli utenti possono dichiarare variabili simili aaa = 123
e quelle sono archiviate in una struttura di dati dinamica per un uso successivo. Chiaramente, sembra ovvio che useresti una soluzione che chiamerà una funzione * alloc (hashmap, elenco collegato, qualcosa del genere). Per questo tipo di programma, non ha senso liberarsi mai dopo aver chiamato malloc
perché queste variabili devono essere sempre presenti durante l'esecuzione del programma e non c'è un buon modo (che posso vedere) per implementarlo con spazio allocato staticamente. È una cattiva progettazione avere un mucchio di memoria allocata ma liberata solo durante la fine del processo? In tal caso, qual è l'alternativa?
free(a)
realtà non fa nulla per liberare memoria! Ripristina semplicemente alcuni puntatori nell'implementazione libc di malloc che tengono traccia dei blocchi di memoria disponibili all'interno di una grande pagina di memoria mmapped (comunemente chiamata "heap"). La pagina verrà comunque liberata solo al termine del programma, non prima.