Quando sento il termine perdita di memoria con ciò intendo un bug in un programma che non causa nessun problema tranne che non libera risorse di memoria e, se continua a farlo, può consumare molta memoria, danneggiare le prestazioni del sistema e, nel peggiore dei casi, mandare in crash il programma (o un altro programma, se il sistema operativo decide di scegliere di ucciderlo). / p>
Ma ora, in questa sezione di commenti di questa domanda, gli upvotes mi hanno fatto pensare se questo è l'intero significato del termine. In passato l'ho sempre visto usato in quel senso.
link
Quindi, chiameresti qualcosa una semplice perdita di memoria che blocca un programma da qualche altro effetto collaterale o causerebbe un dead-block non liberando un lock?
Aggiornamento - Nota: sfortunatamente alcuni admin hanno cancellato la sezione dei commenti, quindi non posso più fare riferimento a quella discussione: /
Fondamentalmente ho detto che una perdita di memoria è innocua tranne che mangia memoria (e di conseguenza a lungo termine in questo senso può essere dannoso, bloccando l'app / sistema). Hanno detto che non è vero, con C ++ RAII può causare seri problemi. - Sì, se non si elimina un oggetto con un codice importante nel distruttore che può causare problemi, ma nel mio vocabolario è un bug grave e non una perdita di memoria.
______ azszpr108885 ___
La perdita di memoria quintessenziale sarebbe esattamente ciò che hai descritto, l'incapacità di liberare un po 'di memoria che il processo aveva allocato. Le conseguenze sarebbero normalmente che il programma crescesse gradualmente di dimensioni mentre è in esecuzione, con possibili effetti secondari a causa di ciò. Le allocazioni di memoria successive potrebbero non riuscire o il sistema potrebbe comportarsi in modo anomalo a causa delle risorse sprecate.
Tuttavia, un problema può essere descritto con precisione come una perdita di memoria, a condizione che in effetti la perdita di memoria. Può anche fare altre cose che sono potenzialmente più serie. Ad esempio, se non si riesce a chiudere un flusso I / O standard, si verificherà una perdita di memoria perché la memoria associata al flusso verrà interrotta. Tuttavia, può anche eseguire il processo fuori dai descrittori di file o forse causare un successivo flusso aperto in errore a causa di un limite sul numero di flussi I / O standard.
______ azszpr108919 ___
Dipende. Certamente il programma potrebbe essersi arrestato a causa di una perdita di memoria. Ma non chiamerei tutte le perdite di memoria di crash. Una perdita di memoria ha una definizione molto chiara.
Un arresto anomalo dell'applicazione potrebbe essere causato da molte cose diverse.
- Eccezione non gestita
- Perdita di memoria
- Perdita di risorse
- Deadlock
- Altro (bug nel codice)
Al momento del crash si dovrebbe prendere un crash / memoria dump e usare qualcosa come Windbg per analizzare lo stato del codice al momento del crash per determinare se si trattava di una perdita di memoria, deadlock, bug, ecc.
Una perdita di memoria semplicemente non libera la memoria dopo averla finita. Ciò può causare un arresto anomalo se i limiti delle risorse sono soddisfatti come indicato.
Una perdita di risorse non libera la risorsa dopo averla finita. Un esempio potrebbe essere aprire una connessione al database e non chiuderla dopo aver terminato.
I deadlock sono diversi dalle perdite, perché le perdite possono non essere rilevate e potrebbero essere benigne se le risorse di sistema non vengono consumate. I deadlock sono una condizione che non si accumula nel tempo.
______ azszpr108888 ___
Un significato correlato di "perdita di memoria" si applica alle lingue che usano la garbage collection. Lì, la memoria supposto deve essere trapelata, ma se non lo fai, è lo stesso problema.
______ azszpr108926 ___
Si verificano perdite di memoria Se non si riesce a eliminare la memoria allocata dinamicamente. puntamento
la perdita di memoria è uno degli aspetti più lunghi e noiosi della programmazione in
ambienti non gestiti.
Un semplice esempio di perdita di memoria può essere seguito.
%pre%
______ azszpr108884 ___
link
%bl0ck_qu0te%
Le perdite di memoria possono causare errori casuali poiché alla memoria possono essere assegnati valori imprevisti.
%bl0ck_qu0te%
I blocchi morti possono essere causati dalla memoria a cui sono stati assegnati valori imprevisti.
Ulteriori letture su questo argomento:
-
link
- link
___