2008-10-23 11 views
10

C'è qualche motivo per liberare memoria in una funzione atexit()?Freeing in atexit()

Ho una variabile globale che viene malloc'ed dopo l'avvio. Potrei scrivere una funzione atexit() per liberarla, ma non è il sistema che recupera tutta quella memoria quando il programma esce comunque?

C'è qualche vantaggio nell'essere in ordine e pulirlo attivamente da solo?

+0

Suona come un duplicato, vedi http://stackoverflow.com/questions/2213627/when-you- uscita-ac-application-is-the-malloc-ed-memory-automaticamente-liberato. – unwind

risposta

19

Non in C - è come riorganizzare le sedie a sdraio mentre la nave affonda intorno a te.

In C++ la risposta è diversa, perché gli oggetti possono eliminare i file temporanei e così via nei loro distruttori, quindi è necessario assicurarsi che vengano richiamati.

10

In tutti i moderni sistemi operativi, è possibile presumere che tutta la memoria verrà liberata alla chiusura del programma.

+2

+1 per sottolineare che questa è una funzionalità del sistema operativo, non della lingua. – unwind

12

Uno dei vantaggi della liberazione è che se si esegue un test di perdita di memoria che tenta di associare le allocazioni con deallocations per tutta la durata del processo, non si otterranno falsi positivi da questo tipo di perdita intenzionale.

+0

Parlando di test di perdita di memoria: http://valgrind.org. – JesperE

+0

Purify utilizzato per eseguire il test della perdita di memoria prima di chiamare le pulizie atexit(). E 'stato fastidioso Ma è stato anche un decennio fa - potrebbe essere cambiato da allora. –

2

Su Windows, alcune chiamate restituiscono memoria che appartiene al sistema operativo o al COM ed è necessario liberare tale memoria in modo esplicito o non verrà liberata anche dopo la conclusione del processo. Ma questo è uno scenario raro.

4

È necessario liberare() se il codice che chiama atexit() fa parte della libreria condivisa caricata dinamicamente (con dlopen(), ad esempio). In questo caso il gestore di atexit verrà chiamato al tempo dlclose() in modo che l'heap continui a esistere per il resto del processo da utilizzare.

10

Vedere come malloc()/free() normalmente coinvolge strutture di dati estese che esistono nello spazio utente, free() memoria quando il programma termina può effettivamente essere un drenaggio delle prestazioni. Se parti della struttura dei dati sono paginate su disco, devono essere caricate dal disco solo per essere scartate!

Considerando che se si termina senza free() ing, i dati scaricati su disco possono morire in pace.

Naturalmente free() ing in altri tempi è generalmente vantaggioso come ulteriori malloc() s possono ri-utilizzare lo spazio liberato e si free() potrebbe anche eliminare la mappatura di un po 'di memoria che può essere utilizzato da altri processi.

1

non libera memoria prima che la chiusura del processo non sia una perdita di memoria. è una perdita di memoria quando si perde una maniglia. ma la memoria non è l'unico tipo di risorsa e le altre risorse persistono tra i processi (come gli handle di finestre e gli handle di file), quindi è necessario "liberare" quelle.

5

In realtà essere in ordine può essere interessante quando il programma si evolve. Ti obbliga a scrivere la funzione di pulizia quando crei le funzioni di "inizializzazione". Il vantaggio arriva quando il programma diventa più complesso e si desidera riavviare parte del programma. Se hai già scritto delle funzioni di pulizia, è meno probabile che tu abbia improvvisamente dimenticato qualche ripulitura quando "riavvii" una parte del tuo programma.

La pulizia delle funzioni di scrittura "pigramente" vale a dire solo quando è necessaria è più soggetta a errori. Scrivere le funzioni di pulizia ti costringe a pensare alla pulizia e alla dipendenza finale dalla pulizia. Permette un più facile riutilizzo del codice di una parte del tuo codice in un altro progetto.

Quindi sì liberare in un atexit è inutile, e così è la chiusura del descrittore di file.Tuttavia, la scrittura e il mantenimento della funzione di pulitura man mano che il codice cresce può costituire un vincolo che ti costringerà a pensare a ciò che stai facendo