Come trovare una perdita di memoria in un codice/progetto C ++

Come trovare una perdita di memoria in un codice/progetto C ++
UN perdita di memoria In un codice o progetto C ++ si verifica quando un programma rivendica più memoria di quanto non sia necessario e non riesce a rilasciare la memoria extra nel sistema operativo. Perdite di memoria può presentare in termini di un'applicazione inaspettatamente che si esaurisce la memoria e si schianta o ha una grave differenza di prestazioni tra due corse successive. Questo problema può causare un errore critico del sistema in un codice o progetto C ++ e dovrebbe essere debug il più presto possibile.

Questo articolo discuterà di cosa perdita di memoria è e quindi fornire una descrizione dettagliata su come trovare perdite di memoria In un codice o progetto C ++.

Cos'è una perdita di memoria

Un problema di computer chiamato a perdita di memoria fa sì che la memoria venga assegnata e liberata in modo improprio. Quando la memoria all'interno di un programma non viene più utilizzata dal programma, la memoria dovrebbe essere rilasciata nel sistema operativo, consentendo l'uso efficiente di tutta la memoria disponibile su un sistema. Tuttavia, quando un programma non riesce a rilasciare la memoria allocata e continua ad accedervi dopo che la sua utilità è stata servita, perdite di memoria può accadere. Questo può portare alla memoria consumata o 'trapelato'Fino a quando il sistema non si esaurisce la memoria libera e il programma si blocca. Poiché tutti i sistemi hanno una quantità finita di memoria e perché la memoria è costosa, l'utilizzo della memoria di un programma aumenterà se contiene perdite di memoria. Pertanto, causerà problemi.

Come trovare perdite di memoria in un codice o progetto C ++?

Esistono alcuni modi di base che puoi utilizzare per rilevare le perdite di memoria in un codice C ++.

1: controlla le basi degli operatori

Conoscere i fondamenti degli operatori. Il nuovo operatore assegna una memoria di heap. La memoria heap viene rilasciata utilizzando l'operatore Elimina. Per rilasciare la stessa memoria che è stata assegnata, è necessario eseguire un'elimina dopo ogni nuovo, altrimenti, c'è una possibilità di perdita di memoria.

2: riallocare solo dopo la cancellazione

Riallicare una memoria solo dopo aver eliminato la sua prima allocazione. Se una variabile ottiene un nuovo indirizzo per una seconda allocazione, il primo indirizzo e i byte ad essa associati vengono perduti permanentemente risultante perdita di memoria.

3: controlla i puntatori assegnati

Osserva i puntatori assegnati. Ogni variabile dinamica (memoria allocata sul heap) deve essere collegata a un puntatore. È difficile eliminare una variabile dinamica dopo che si separa dal suo puntatore / i. Ancora una volta, questo causa a perdita di memoria.

4: controlla i suggerimenti locali

Usa attentamente i puntatori locali. Quando si definisce un puntatore in una funzione, la variabile dinamica indica viene assegnata sul heap, non sullo stack. Rimarrà se non lo rimuoverà anche dopo che il programma è finito perdite di memoria.

5: Usa parentesi quadrate dopo eliminare attentamente

Prendi nota delle parentesi quadrate che seguono "eliminare". Per liberare un singolo elemento, usa Elimina da solo. Per rilasciare un array di heap, utilizzare Elimina [] racchiuso tra parentesi quadrate.

Come evitare le perdite di memoria?

  • Ove possibile, tenta di utilizzare puntatori intelligenti anziché gestire manualmente la memoria.
  • Sostituisci std :: string per char *. La classe STD :: String, che è rapida e ben ottimizzata, gestisce tutta la gestione della memoria all'interno.
  • Non utilizzare mai un puntatore grezzo a meno che non sia necessario connettersi a una libreria obsoleta.
  • Nessuno o un numero limitato di chiamate nuove/eliminate nel programma è il metodo più semplice per prevenire perdite di memoria in c++. Qualsiasi requisito per la memoria dinamica dovrebbe essere nascosto all'interno di un oggetto RAII che rilascia la memoria all'uscita. RAII garantisce che la memoria verrà trattata quando una variabile uscirà dall'ambito attuale allocando la memoria nel costruttore e rilasciandola nel distruttore.
  • Scrivi tutto il codice tra le parole chiave nuove ed elimina che vengono utilizzate per allocare e trattare la memoria.

Programma per evitare perdite di memoria

Per esempio:

#includere
#includere
Utilizzo dello spazio dei nomi std;
void func_to_handle_mem_leak ()

int* ptr = new int (5);
cout<
int main ()

func_to_handle_mem_leak ();
restituzione 0;

IL Pointer nel programma sopra non viene eliminato dopo la sua allocazione. Questo provoca il perdita di memoria Nel codice C ++ sopra.

#includere
#includere
Utilizzo dello spazio dei nomi std;
void func_to_handle_mem_leak ()

int* ptr = new int (5);
cout<eliminare (PTR);

int main ()

func_to_handle_mem_leak ();
restituzione 0;

In questo codice, stiamo eliminando quindi il puntatore nella funzione definita dall'utente perdita di memoria è evitato.

Produzione

Conclusione

Perdite di memoria All'interno di un programma può avere risultati dannosi se il programma è piccolo o grande. Risolvere perdite di memoria, Strumenti di analisi statica, strumenti diagnostici e strumenti di debug sono parte integrante nella ricerca e nella risoluzione del problema. Pertanto, il codice o i progetti C ++ devono essere regolarmente esaminati e analizzati per rilevare qualsiasi perdite di memoria, Utilizzando gli strumenti e le tecniche sopra, è possibile mitigare le perdite di memoria in un codice C ++.