Nwlapcug.com


Come evitare perdite di memoria in C++

Una perdita di memoria è un tipo di programmazione bug che si verifica quando un programma alloca più memoria libera. In questo modo, un'applicazione può esaurire la memoria e causare il blocco del sistema. Per evitare perdite di memoria, è necessario sapere quando si verificano più di frequente ed essere coscienziosi con l'utilizzo del "nuovo" e "Elimina" operatori di C++.

Istruzioni

1

Capire le basi di operatore. L'operatore C++ "nuovo" alloca memoria heap. L'operatore "delete" libera memoria heap. Per ogni "nuovo" si deve usare "eliminazione" in modo che è liberare la stessa memoria che è allocata:

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

delete [] str; Cancellare quei 30 byte e assicurarsi str scegliere nulla.

2

Riallocare la memoria solo se l'hai cancellato. Nel codice seguente, str acquisisce un nuovo indirizzo con la seconda assegnazione. Il primo indirizzo è irrimediabilmente perduto, e così sono i 30 byte che indicava. Ora che sono impossibili da libero, e si ha una perdita di memoria:

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

delete [] str; Rimuovere il commento primo marcatura in questa linea per correggere.

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

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

3

Guarda le assegnazioni di puntatore. Ogni variabile dinamica (memoria allocata sull'heap) deve essere associato un puntatore. Quando una variabile dinamica diventa dissociata dal suo pointer(s), diventa difficile da cancellare. Ancora una volta, causando una perdita di memoria:

char str1 = new char [30];

char str2 = new char [40];

strcpy (str1, "Perdita di memoria");

str2 = str1; Male! Ora le 40 byte sono impossibili da libero.

Elimina str2 []; Questo elimina i 30 byte.

Elimina str1 []; Possibile violazione di accesso. Che disastro!

4

Siate cauti con i puntatori locali. Un puntatore che si dichiara in una funzione è allocato sullo stack, ma la variabile dinamica che punti al è allocata sull'heap. Se non si elimina, questi verranno mantenuti dopo il programma esce dalla funzione:

void Leak(int x) () {

char * p = new char [x];

Elimina p []; Rimuovere il contrassegno di commento primo di correggere.

}

5

Prestare attenzione alle parentesi quadre dopo "Elimina." Utilizzare "Elimina" di per sé per liberare un singolo oggetto. Utilizzare [] tra parentesi quadre gratuita una matrice di heap "Elimina". Non fare qualcosa di simile:

char uno = new char;

delete [] Sbagliato

char molti = new char [30];

Elimina molti; Sbagliato!

Consigli & Avvertenze

  • Evitare la combinazione di C e C++. Uso nuovo ed Elimina, o utilizzare malloc () e Free (). Sotto nessun uso di circostanze nuovo con Free () o malloc () con Elimina.