Domanda

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

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

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

È stato utile?

Soluzione

Non in C - è come riordinare 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 chiamati.

Altri suggerimenti

Uno dei vantaggi della liberazione è che se esegui qualsiasi test di perdita di memoria che tenti di abbinare allocazioni e deallocazioni per tutta la durata del processo, non otterrai falsi positivi da questo tipo di perdita deliberata.

Visto come malloc () / free () normalmente coinvolge ampie strutture di dati esistenti nello spazio utente, free () ing memory quando il tuo la fine del programma può effettivamente essere un calo 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 () , i dati inviati al disco possono morire in pace.

Ovviamente free () altre volte è di solito utile poiché ulteriori malloc () possono riutilizzare lo spazio che hai liberato e free () potrebbe persino annullare la mappatura della memoria che può quindi essere utilizzata da altri processi.

In tutti i moderni sistemi operativi, puoi tranquillamente supporre che tutta la memoria verrà liberata quando il programma termina.

In realtà essere in ordine può essere interessante quando il programma si evolve. Ti costringe a scrivere la funzione di pulizia quando crei " inizializzazione " funzioni. Il vantaggio arriva quando il programma diventa più complesso e si desidera riavviare parte del programma. Se hai già scritto funzioni di pulizia funzionanti, è meno probabile che ti sia improvvisamente dimenticato un po 'di pulizia quando " riavvio " parte del tuo programma.

Scrivere funzioni di pulizia "pigramente" cioè solo quando ne hai bisogno è più soggetto a errori. La scrittura di funzioni di pulizia ti costringe a pensare alla pulizia e all'eventuale dipendenza dalla pulizia. Permette un riutilizzo del codice più semplice di una parte del codice in un altro progetto.

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

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

Su Windows, alcune chiamate restituiscono la memoria che appartiene al sistema operativo o a COM e è necessario liberare esplicitamente tale memoria o non verrà liberata anche al termine del processo. Ma questo è uno scenario raro.

non liberare memoria prima della conclusione del processo non è una perdita di memoria. è una perdita di memoria quando si perde una maniglia. ma la memoria non è l'unico tipo di risorsa e altre risorse persistono nei processi (come handle di finestre e handle di file), quindi è necessario "liberarli".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top