2013-04-08 19 views
6

Supponiamo di inserire qualche memoria in alcuni puntatori ma di non liberarli prima che il programma esca. Questa memoria viene liberata automaticamente all'uscita o la perdita di memoria continuerà ad esserci fino al riavvio del computer?L'heap viene liberato quando il programma termina?

+1

Passare attraverso [questo] (http://stackoverflow.com/questions/2215259/will-malloc-implementations-return-free-ed-memory-back-to-the-system) e [questo] (http: //stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc) anche. –

risposta

5

La risposta è, più spesso.

Liberare l'heap è responsabilità del sistema operativo. Mentre la maggior parte del SO (in particolare il sistema operativo mainstream) libera l'heap all'uscita, non è necessariamente vero per quanto riguarda il sistema operativo integrato.

Quando si chiama la memoria da allocare nell'heap, viene effettuata una chiamata di sistema allo spazio del kernel del sistema operativo per fornire questa memoria. Questa memoria è mappata alla struttura del processo, che è gestita dal sistema operativo. Quando il programma termina, il sistema operativo passa attraverso un clean up routing, chiude tutti i descrittori di file e contrassegna questa memoria libera per l'allocazione ad altri processi (tra le altre cose).

Alcune di queste risposte non sono corrette nel dire che dipende dal compilatore. Il compilatore non dice "hey libera tutta questa memoria all'uscita del programma". Ciò non avrebbe senso, cosa succede se il sistema operativo inaspettatamente termina il programma allora? No, il compilatore è responsabile della generazione di chiamate di sistema ogni volta che l'allocazione di memoria/deallocazione viene richiesta esplicitamente per l'heap.

1

Qualsiasi sistema operativo desktop moderno richiederebbe le risorse quando il processo termina. Non ci saranno perdite di memoria.

2

La memoria non verrà liberata dal programma o dalla libc, ma verrà liberata dal sistema operativo su tutti i sistemi operativi moderni. Assegnano memoria a processi specifici e puliscono la memoria quando il processo termina.

+0

non tutti i sistemi operativi lo faranno. – 75inchpianist

1

Dipende dal sistema operativo in uso. Ovviamente, qualsiasi sistema operativo desktop moderno è progettato per cancellare dopo l'uscita del programma, se necessario.

1

Se si guarda allo standard C, è specifico per l'implementazione, quindi non si può essere sicuri di ciò.

Ma la maggior parte del sistema operativo libera la memoria una volta terminato un processo, ma potrebbe non essere il caso su alcune piattaforme più piccole/più semplici.

1

Questa non è una domanda. Il modo in cui l'heap viene implementato dipende dal compilatore e da cosa fa il sistema operativo dopo che un programma è stato chiuso. A mia conoscenza tutte le moderne risorse di memoria os free quando un programma esce. Questo potrebbe non essere vero su alcuni sistemi o driver incorporati.

+0

la modalità di liberazione dell'heap dopo la chiusura del programma è indipendente dal compilatore. è un problema del sistema operativo. – 75inchpianist

+0

Sì, questo è quello che ho cercato di dire. ma non bene. Il compilatore ha qualche opinione su come vengono implementati gli heap. Puoi avere programmi C su OS che non hanno spazi di indirizzi virtuali o gestione della memoria. In tutti gli impianti moderni il compilatore inoltra le chiamate alle chiamate di sistema, ma questo non è necessariamente il caso – rerun

Problemi correlati