Domanda

Quali sono alcuni dei motivi generali per errori di perdita di memoria e errori di segmentazione?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top