2010-01-27 23 views

risposta

15

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 ...

+5

+1 Ben detto, questo è un problema _hard_ –

+2

+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

+0

@John - Sono considerato infantile come schiacciare l'enfasi nel tuo commento? – ChaosPandion

3

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.

2

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.

+1

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. –

1
  1. Bug.

  2. 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.

  3. 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.

1

Mancanza di ambiti strutturati e chiara proprietà della memoria allocata.

Problemi correlati