Come prevenire perdite di memoria in C ++

May 12

Una perdita di memoria è un tipo di problema di programmazione che si verifica quando un programma alloca più memoria di esso libera. In questo modo, un'applicazione può esaurire la memoria e causare il crash di sistema. Per evitare perdite di memoria, è necessario sapere quando si verificano più frequentemente e di essere consapevole con il suo uso dei "nuovi" e operatori "cancellare" C ++.

istruzione

1 Capire le basi operatore. L'operatore C ++ "nuovo" alloca la memoria heap. L'operatore "delete" libera la memoria heap. Per ogni "nuovo", è necessario utilizzare un "Cancella" in modo da liberare la stessa memoria allocata:

char * str = new char [30]; // Allocare 30 byte per ospitare una stringa.

delete [] str; // Cancella quei 30 byte e fare punto str da nessuna parte.

2 Riallocare la memoria solo se hai eliminato. Nel seguente codice, str acquisisce un nuovo indirizzo con la seconda assegnazione. Il primo indirizzo è perso irrimediabilmente, e così sono i 30 byte che indicò. Ora sono impossibili da libera, e si dispone di una perdita di memoria:

char * str = new char [30]; // Dare str un indirizzo di memoria.

// Delete [] str; // Rimuove la prima marcatura in questa linea per correggere commento.

str = new char [60]; // Dare str un altro indirizzo di memoria con il primo andato per sempre.

delete [] str; // Questo elimina i 60 byte, e non solo i primi 30.

3 Guarda tali assegnazioni puntatore. Ogni variabile dinamica (memoria allocata sull'heap) deve essere associato con un puntatore. Quando una variabile dinamica si distacca dalla sua puntatore (s), diventa impossibile da cancellare. Ancora una volta, questo si traduce in una perdita di memoria:

char

str1 = new char [30];

char str2 = new char [40];

strcpy (str1, "Perdita di memoria");

str2 = str1; // Cattivo! Ora i 40 byte sono impossibili da liberare.

eliminare str2 []; // Questo elimina i 30 byte.

eliminare str1 []; // Violazione di accesso possibile. Che disastro!

4 Fate attenzione con i puntatori locali. Un puntatore si dichiara in una funzione viene allocato sullo stack, ma la variabile dinamica che punti a è allocato sul mucchio. Se non si elimina, esso persisterà dopo il programma viene chiuso dalla funzione:

annullare Leak (int x) {

char * p = new char [x];

// Delete [] p; // Rimuove la prima marcatura di correggere commento.

}

5 Prestare attenzione alle parentesi quadre dopo "cancellare". Utilizzare "delete" da solo per liberare un singolo oggetto. Utilizzare "delete" [] con parentesi quadre per liberare una matrice mucchio. Non fare qualcosa di simile a questo:

char uno = new char;

delete [] uno; // Sbagliato

char molti = new char [30];

eliminare molti; // Sbagliato!

Consigli e avvertenze

  • Evitare di mischiare C e C ++. Utilizzare new e delete, o utilizzare malloc () e free (). In nessun caso utilizzare nuova connessione () o malloc () con eliminazione.