La memoria persa viene liberata quando il programma viene chiuso?


Risposte:


151

Sì, una "perdita di memoria" è semplicemente memoria a cui un processo non ha più un riferimento e quindi non può più liberare. Il sistema operativo tiene ancora traccia di tutta la memoria assegnata a un processo e la libererà al termine del processo.

Nella stragrande maggioranza dei casi il sistema operativo libererà la memoria, come nel caso delle normali "versioni" di Windows, Linux, Solaris, ecc. Tuttavia è importante notare che in ambienti specializzati come vari sistemi operativi in ​​tempo reale il la memoria potrebbe non essere liberata quando il programma viene terminato.


4
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, quello spazio viene restituito al sistema all'ingrosso, giusto? Non vedo perché sarebbe necessaria una contabilità extra, poiché il processo che effettua le allocazioni è l'unico processo (in userland) con accesso comunque a quelle pagine. O sono stato insegnato male?
Chris Tonkinson

6
@ Justin: Senza conoscere il sistema operativo non penso che questo sia valido. Forse specifica esplicitamente il sistema operativo di cui stai parlando.
Brian R. Bondy

1
Nota: lo standard non dice nulla al riguardo. Inoltre non è garantito. Questo è il modo in cui funziona sulla maggior parte, se non tutti, i sistemi operativi moderni, ma non è necessario e in passato c'erano quelli che erano entrambi comuni e non eseguivano questa pulizia.
Edward Strange

5
Esistono vari sistemi operativi in ​​tempo reale per piccoli dispositivi e così via che non recuperano la memoria persa a causa delle perdite. La tua domanda dipende dal sistema operativo di cui stai parlando.
Brian Neal

14
Anche con specifici sistemi operativi protetti dalla memoria, è comunque necessario definire "perdita". È molto probabile che le applicazioni allocino risorse di "sistema" al di fuori del proprio spazio di memoria (gli handle sono spesso utilizzati per identificarli nel mondo Windows). La chiusura dell'applicazione non garantisce sempre il rilascio di questi tipi di risorse.
David

34

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

Detto questo, Windows e tutte le distribuzioni di Linux che io abbia mai visto liberano perdite di memoria.

Puoi facilmente creare un enorme ciclo di perdite di memoria per testarlo tu stesso. Guarda aumentare l'utilizzo della RAM e quindi chiudi il programma. Vedrai che l'utilizzo della RAM diminuisce.


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


14

Stai utilizzando un sistema operativo desktop (Windows, Linux ecc.)? Se è così, sì, in generale il sistema libererà tutta la memoria associata al programma quando il programma esce.


10

Di solito sì. Alcuni sistemi supportano cose come i blocchi di memoria condivisa che non vengono liberati automaticamente quando un programma esce. La maggior parte mantiene ancora un conteggio dei riferimenti e lo elimina quando tutti i programmi che lo hanno aperto escono, ma alcuni non lo fanno (ad esempio, Windows a 16 bit aveva alcuni tipi di elementi che sarebbero rimasti allocati anche quando non si riferiva a loro, sebbene di solito si bloccava per altri motivi prima che si accumulasse una quantità sufficiente di questo per causare un problema ...)


5

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


4

Dipende dalla memoria che hai perso. Parte della memoria non può essere recuperata dal sistema operativo. La maggior parte della memoria sulla maggior parte dei sistemi operativi, tuttavia, verrà automaticamente recuperata quando il processo termina.


6
Parte della memoria non può essere recuperata dal sistema operativo, come cosa?

2
Su alcuni sistemi operativi in ​​tempo reale, ho visto speciali blocchi di buffer Ethernet che non vengono ripuliti quando un processo termina.
Brian Neal

1
Inoltre, la memoria condivisa di solito non viene recuperata, perché potresti volerla persistere per i processi temporanei da utilizzare.
Brian Neal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.