Quali sono alcuni dei motivi generali per perdita di memoria e errore di segmentazione?
-
05-07-2019 - |
Domanda
Quali sono alcuni dei motivi generali per errori di perdita di memoria e errori di segmentazione?
Soluzione
segfaults:
- utilizzo di puntatori pendenti: non reimpostare i puntatori dopo la deallocazione
- non controlla un puntatore prima dell'uso
- non inizializzare variabili / membri
Perdite di memoria / risorse:
- dimenticando di rilasciare la risorsa (memoria libera, chiusura del file, ...)
- in ambienti con Garbage Collector: creazione di un anello di oggetti di riferimento
Come rilevare / evitare:
- puntatori penzolanti: regola di codifica, reimpostare rigorosamente i puntatori dopo la deallocazione
- usa un controllo di codice statico per evitare la maggior parte dei segfault
- utilizza un analizzatore di codice dinamico per verificare che le perdite di risorse siano assenti
Altri suggerimenti
Perdite di memoria : in genere si riferisce a una lingua come C in cui gestisci la memoria manualmente. In questo caso, allocare la memoria senza liberarla al termine dell'utilizzo. Le allocazioni continuano ad accumularsi mentre l'applicazione è in esecuzione e la memoria non può essere liberata fino al termine dell'esecuzione del processo. Perdite di memoria (Wikipedia)
Errori di segmentazione : il motivo più comune di questo tipo di errore è tentare di accedere a una parte della memoria che non esiste o è al di fuori della memoria consentita del programma in esecuzione (ad esempio se si è tentato di accedere alla memoria in cui è caricato il sistema operativo). Di solito questo significa che stai tentando di utilizzare un puntatore errato, quindi ad esempio:
int* ptr;
...
...
...
*ptr = 5;
provocherebbe un segfault perché ptr è un puntatore null (o garbage) e non hai allocato memoria per il puntatore a cui puntare. Errore di segmentazione (Wikipedia)
Lotti, tra cui:
- allocazione di un pezzo di memoria e quindi utilizzo di più di quanto allocato,
- allocare memoria e non liberarla,
- non inizializzare correttamente i puntatori di dati,
- non inizializza correttamente i puntatori a funzioni,
- funzioni di chiamata con numeri o valori di parametri errati,
- tentando di leggere o scrivere tramite i puntatori NULL,
- collegamento errato a librerie o a librerie errate.
Non tutte si applicano a tutte le lingue, ma queste sono alcune cose utili su cui iniziare a pensare.
Vedi la serie C ++ efficace in Addison Wesley, ottima per il problema in questione. Si noti che nell'uso del puntatore è necessario eliminare singolarmente tutti gli elementi, quindi eliminare il puntatore: richiede abilità e spesso non è corretto, portando a errori nascosti che non si presentano facilmente. Gli altri poster hanno le risposte, sto solo aggiungendo un dettaglio aggiuntivo.