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?
risposta
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.
Qualsiasi sistema operativo desktop moderno richiederebbe le risorse quando il processo termina. Non ci saranno perdite di memoria.
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.
non tutti i sistemi operativi lo faranno. – 75inchpianist
Dipende dal sistema operativo in uso. Ovviamente, qualsiasi sistema operativo desktop moderno è progettato per cancellare dopo l'uscita del programma, se necessario.
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.
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.
la modalità di liberazione dell'heap dopo la chiusura del programma è indipendente dal compilatore. è un problema del sistema operativo. – 75inchpianist
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
- 1. Come viene liberato lo spazio assegnato dinamicamente quando un programma viene interrotto utilizzando Ctrl-C?
- 2. break termina il programma - C++
- 3. Terminare l'esecuzione del processo con `exec` quando termina il programma
- 4. python: come terminare un thread quando il programma principale termina
- 5. programma esterno di arresto quando il programma Java viene arrestato
- 6. La memoria perduta viene liberata quando si esce dal programma?
- 7. Un ambito termina quando non viene restituito alcun riferimento?
- 8. Come Eclipse termina un programma in esecuzione?
- 9. Perché la mia istanza AWS EC2 termina quando viene interrotta?
- 10. L'eccezione com.google.zxing.NotFoundException arriva quando viene eseguito il programma Java core?
- 11. Perché il distruttore di oggetti non viene chiamato quando termina lo script?
- 12. Come eliminare l'oggetto boost boost quando termina il thread stesso?
- 13. Il programma termina bruscamente anche nel debugger - come è successo?
- 14. Un thread rilascia un lucchetto quando termina?
- 15. I thread figlio terminano quando termina il thread padre
- 16. Programma Java che termina dopo ObjectMapper.writeValue (System.out, responseData) - Jackson Library
- 17. Come rilevare quando termina l'applicazione?
- 18. checksum errata per oggetto liberato
- 19. Informazioni su SIGCHLD quando termina il processo figlio
- 20. Come scoprire quando il processo termina in Linux?
- 21. BatchUpdateException: il batch non termina
- 22. "Sicuro" termina un programma C++ in esecuzione su Keypress?
- 23. forzare un programma per svuotare l'output standard quando viene reindirizzato
- 24. Il sottoprocesso termina ma non termina, causando un deadlock
- 25. Errore server quando l'URL termina con '/'
- 26. Youtube + Selenium (Python) - Come sapere quando termina il video?
- 27. Mentre il ciclo non termina quando il flag è cambiato in thread diversi
- 28. Se un programma di console termina, le connessioni al database utilizzate nel programma rimarranno ancora aperte?
- 29. Come ripulire il programma quando si esce dal programma javafx?
- 30. Come sapere quando EnumWindows termina il suo elenco di finestre?
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. –