2010-06-04 13 views

risposta

78

Sì, una "perdita di memoria" è semplicemente memoria a cui un processo non ha più un riferimento e che quindi non può più essere libero. Il sistema operativo continua a tenere traccia di tutta la memoria allocata a un processo e lo libererà al termine di tale processo.

Aggiornamento

Nella stragrande maggioranza dei casi, il sistema operativo sarà liberare la memoria - come è il caso con normali "sapori" di Windows, Linux, Solaris, ecc, tuttavia, è importante notare che in ambienti specializzati come vari sistemi operativi in ​​tempo reale, la memoria non può essere liberata quando il programma viene terminato.

+2

Domanda: il sistema operativo tiene traccia di tutte le allocazioni? Qualsiasi memoria heap allocata proviene dallo spazio di memoria virtuale del processo - quando il processo termina, lo spazio viene restituito al sistema all'ingrosso, giusto? Non vedo perché la contabilità aggiuntiva sarebbe necessaria, dal momento che il processo di allocazione è l'unico processo (in userland) con accesso a tali pagine comunque. O sono stato istruito male? –

+5

@Justin: Senza conoscere il sistema operativo, non penso che questo sia valido. Forse specificare esplicitamente il sistema operativo di cui si sta parlando. –

+1

Nota: lo standard non dice nulla a riguardo. Inoltre non è garantito. Questo è il modo in cui funziona sulla maggior parte, se non tutti, dei moderni SO, ma non è necessario e in passato c'erano quelli che erano entrambi comuni e non hanno fatto questa pulizia. –

19

Il sistema operativo che esegue il programma di solito esegue la pulizia della memoria che non è stata liberata in modo esplicito e gestisce non chiusi in modo esplicito, ma ciò non è garantito dallo standard C++. È possibile trovare alcuni dispositivi incorporati che non liberano le perdite di memoria.

Detto questo, Windows e tutte le distro di Linux che ho mai visto liberano le perdite di memoria.

Si può facilmente creare un enorme loop di perdite di memoria anche se per testarlo da soli. Guarda come cresce l'utilizzo della RAM e poi chiudi il programma. Vedrai che l'utilizzo della RAM si riduce.


Un'altra considerazione da considerare quando si utilizza C++ è che se non si elimina la memoria allocata heap poi i tuoi distruttori non sono inoltre chiamati. A volte avrai anche altri effetti collaterali se i tuoi distruttori non vengono chiamati.

9

Sei in esecuzione su un sistema operativo desktop (Windows, Linux ecc.)? In tal caso, sì, in generale il sistema libererà qualsiasi memoria associata al programma quando il programma verrà chiuso.

1

Dipende dalla memoria che hai trapelato. Alcune memorie non possono essere recuperate dal sistema operativo. La maggior parte della memoria sulla maggior parte dei sistemi operativi verrà automaticamente recuperata al termine del processo.

+5

Alcuni tipi di memoria non possono essere recuperati dal sistema operativo, ad esempio cosa? –

+1

Su alcuni sistemi operativi in ​​tempo reale, ho visto speciali blocchi buffer Ethernet che non vengono ripuliti all'uscita di un processo. –

+1

Anche la memoria condivisa di solito non viene recuperata, perché potrebbe volere che venga mantenuta per i processi transitori da utilizzare. –

1

Per quanto ne so, un sistema operativo moderno libererà questa memoria una volta che il programma termina.

5

Di solito, sì. Alcuni sistemi supportano cose come blocchi di memoria condivisa che non vengono automaticamente liberati quando un programma viene chiuso. La maggior parte conserva ancora un conteggio dei riferimenti e la cancella quando tutti i programmi che l'hanno aperta escono, ma alcuni non lo fanno (ad esempio, Windows a 16 bit aveva alcuni tipi di elementi che sarebbero rimasti allocati anche quando non ci si riferiva a loro - sebbene di solito si è schiantato per altri motivi, prima che si accumulasse abbastanza per causare un problema ...)

Problemi correlati