A causa di incomprensioni di base su come la memoria viene allocata e deallocata dinamicamente da parte del programmatore? È dovuto al compiacimento?Perché le perdite di memoria sono comuni?
risposta
No. È dovuto alla mole di contabilità necessaria per tenere traccia di ogni allocazione di memoria. Chi è responsabile dell'allocazione della memoria? Chi è responsabile per liberarlo? Assicurandosi di utilizzare la stessa API per allocare e liberare la memoria, ecc ... Assicurandoti di catturare ogni possibile flusso di programma e ripulire in ogni situazione (ad esempio, assicurati di ripulire dopo aver rilevato un errore o un'eccezione). L'elenco può continuare ...
+1 Ben detto, questo è un problema _hard_ –
+1 Ditto. Questo è tutto ciò che volevo dire e altro ancora. Adoro le persone non documentate dell'API che mi aspettano che io sia un guru divinatorio dell'allocazione della memoria. – wheaties
@John - Sono considerato infantile come schiacciare l'enfasi nel tuo commento? – ChaosPandion
In un progetto di dimensioni decenti, è possibile perdere traccia delle risorse allocate.
A volte una funzione viene scritta in attesa di un'infrastruttura di dati non inizializzata come input che verrà quindi inizializzata. Qualcuno passa in una struttura dati che è già stata inizializzata e quindi la memoria allocata in precedenza è trapelata.
Le perdite di memoria sono causate da incomprensioni di base nello stesso senso ogni errore. E sarei scioccato nello scoprire che chiunque scrive codice bug gratis la prima volta ogni volta. Le perdite di memoria sono il tipo di errore che raramente causa un arresto anomalo o un comportamento esplicitamente errato (oltre all'uso di troppa memoria, ovviamente), quindi a meno che le perdite di memoria non siano esplicitamente testate per uno sviluppatore probabilmente non sapranno mai di essere presenti. Dato che le modifiche apportate al codebase aggiungono sempre bug e le perdite di memoria sono praticamente invisibili, le perdite di memoria si espandono man mano che un programma invecchia e si espande.
Anche in lingue che dispongono di gestione automatica della memoria, la memoria può essere trapelata a causa di riferimenti ciclici, a seconda dell'algoritmo di garbage collection utilizzato.
Penso che sia dovuto alle pressioni del lavoro nel lavoro che richiede le deadline e il management superiore che spingono il progetto a portarlo fuori dalla porta. Quindi puoi immaginare, con il test, q & a, recensioni di peer code, in tali ambienti pressurizzati, che le perdite di memoria potrebbero scivolare attraverso la rete.
Dal momento che la tua domanda non ha menzionato il linguaggio, oggi, non c'è gestione automatica della memoria che si occupa della contabilità di memoria/monitoraggio per garantire l'assenza di memoria si verificano perdite, pensare Java/.NET, ma alcuni possono scivolare attraverso la rete. Sarebbe stato come C/C++ che usa le funzioni malloc
/new
e, invariabilmente, è più difficile da controllare, a causa del volume di memoria disponibile.
Quindi, ancora una volta, rintracciare quelle perdite può essere difficile da trovare che sta lanciando un'altra curva a questa risposta - è che funziona sulla macchina dello sviluppatore che non viene visualizzata, ma quando in produzione, la memoria inizia perdendo a dismisura, è la configurazione, l'hardware, la configurazione del software, o peggio, la perdita di memoria può apparire in una situazione casuale che è unica all'interno dell'ambiente di produzione, o è il vincolo tempo/costo che ha permesso che si verificassero perdite di memoria o è che gli strumenti di profilazione della memoria costano proibitivi o mancanza di fondi per aiutare il team di sviluppo a rintracciare le perdite ...
Tutto sommato, ognuno all'interno del team di sviluppo, ha la propria responsabilità di assicurare che il codice funzioni e conoscere le regole per la gestione della memoria (ad esempio, come ad ogni malloc
ci dovrebbe essere un free
, per ogni new
ci dovrebbe essere un delete
), ma nessuna colpa deve essere contabilizzato il team di sviluppo se stessi, né è dito puntato verso la direzione per "accumulare pressione sulla squadra di sviluppo".
Alla fine del giorno, sarebbe una falsa economia fare affidamento solo sulla squadra di sviluppo e mettere "compiacimento" sulle loro spalle.
Spero che questo aiuti, Cordiali saluti, Tom.
Le perdite di memoria sono solo bug. Le pressioni su di te come programmatore potrebbero farti fare più errori (capita a me), ma senza alcuna pressione, avrai ancora delle perdite. È solo un problema difficile. –
Bug.
Anche senza bug, può essere impossibile sapere in anticipo quale funzione dovrebbe deallocare la memoria. È abbastanza semplice se la struttura del codice è essenzialmente funzionale (la funzione principale chiama sub-funzioni, che processano i dati e restituiscono un risultato), ma non è banale se diverse pedate (o più oggetti diversi) condividono un pezzo di memoria. È possibile utilizzare puntatori intelligenti (in C++), ma per il resto è più o meno impossibile.
Le perdite non sono il peggior tipo di errore. Il loro effetto è generalmente solo un peggioramento cumulativo delle prestazioni (finché non si esaurisce la memoria), quindi non hanno una priorità altrettanto alta.
Mancanza di ambiti strutturati e chiara proprietà della memoria allocata.
- 1. Le perdite di memoria sono possibili con decltype (new any_type())?
- 2. Quali sono alcuni metodi comuni per causare perdite di memoria utilizzando JQuery/JavaScript?
- 3. Perché nested initializer_list causa perdite di memoria
- 4. Perdite di memoria Python
- 5. perdite di memoria Node.js?
- 6. punti di perdite di memoria Android non sono chiari!
- 7. Perdite di memoria che sono ancora presenti in WPF 4
- 8. Perdite di memoria Oracle T4CPreparedStatement?
- 9. Come evitare perdite di memoria?
- 10. Perdite di memoria direttive angolari?
- 11. Come ignorare le perdite di memoria false positive da _CrtDumpMemoryLeaks?
- 12. Perdite di memoria massive WP8
- 13. Perdite di memoria tramite socket.io
- 14. Java Assegnazione di memoria Perdite
- 15. memoria dell'applicazione nvd3 perdite
- 16. Come nascondere le perdite di memoria previste in FastMM?
- 17. Come identificare le perdite di memoria in Android?
- 18. AVAudioPlayer ha precaricato le perdite di suono dalla memoria
- 19. Perché "try catch" in Objective-C causa perdite di memoria?
- 20. Memoria rischio di perdite in JavaScript chiusure
- 21. Come gestire le perdite di memoria in RMagick in Ruby?
- 22. Modelli comuni di memoria di riferimento/fuga Java?
- 23. L'utilizzo di goto causerà perdite di memoria?
- 24. Cosa fare quando le "perdite di memoria" sono causate dal framework Foundation?
- 25. Debug di perdite di memoria FLEX/AS3
- 26. Perdite di memoria Symfony2 Doctrine2/supera il limite di memoria
- 27. Perdite di memoria del servizio WCF
- 28. rilevare perdite di memoria a nodejs
- 29. Perdite di memoria di tipo incompleto?
- 30. Come risolvere le perdite di memoria del listener swing?
Personalmente, penso che sia il 40% di ignoranza, il 40% di incuria e il 20% di pigrizia. – ChaosPandion
Essere umano ... – bryantsai