0Pricing
C++ Academy · Lezione

Nozioni di base su Valgrind

Rilevare memory leak ed errori

Nozioni di base su Valgrind è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Che cos'è Valgrind?

Valgrind è un framework di strumentazione. Il suo strumento predefinito, Memcheck, rileva perdite ed errori di memoria senza ricompilare il programma, eseguendolo su una CPU simulata.

Eseguire Memcheck

Avvii il programma tramite Valgrind. Prima lo compili con -g per ottenere i numeri di riga.

g++ -g main.cpp -o app
valgrind --leak-check=full ./app

Rilevare le perdite di memoria

Memcheck segnala la memoria ancora allocata all'uscita, classificandola come persa definitivamente, persa indirettamente o ancora raggiungibile.

#include <cstdlib>

int main() {
    int* p = (int*)malloc(40); // never freed -> definitely lost
    return 0;
}

Categorie delle perdite

Impari a interpretare le categorie del report.

  • Persa definitivamente: non rimane alcun puntatore; è una vera perdita
  • Persa indirettamente: è raggiungibile solo tramite un blocco perso
  • Ancora raggiungibile: all'uscita esiste un puntatore (spesso non è un problema)

Letture e scritture non valide

Memcheck segnala gli accessi a memoria non allocata o già deallocata, indicando indirizzo e dimensione.

#include <cstdlib>

int main() {
    int* a = (int*)malloc(2 * sizeof(int));
    a[5] = 1; // invalid write past the block
    free(a);
    return 0;
}

Valori non inizializzati

Memcheck avvisa quando una condizione o un output dipende da un valore non inizializzato, una causa comune di bug non deterministici.

#include <iostream>

int main() {
    int x;            // uninitialized
    if (x == 42)      // use of uninitialized value
        std::cout << "hi\n";
    return 0;
}

Leggere l'output

Ogni blocco di errore mostra l'operazione, lo stack delle chiamate che ha causato l'errore e, per i blocchi dell'heap, il punto in cui è stata allocata la memoria. HEAP SUMMARY riporta i totali delle allocazioni e delle perdite.

Opzioni utili

Opzioni comuni:

  • --leak-check=full: mostra i dettagli di ogni perdita
  • --show-leak-kinds=all
  • --track-origins=yes: segue i valori non inizializzati fino alla loro origine
  • --error-exitcode=1: fa fallire la CI in presenza di errori

Valgrind e ASan a confronto

Entrambi rilevano i bug di memoria, ma presentano compromessi diversi.

  • Valgrind: non richiede la ricompilazione, è più lento (da 10 a 50 volte) e rileva bene le letture di valori non inizializzati
  • ASan: richiede la ricompilazione, è molto più veloce e rileva meglio gli overflow dello stack

Sopprimere i problemi noti

Le librerie di terze parti possono produrre segnalazioni irrilevanti. Generi e applichi un file di soppressione con --gen-suppressions=all e --suppressions=file per nascondere i report noti e innocui.

Quando usare Valgrind

Scelga Valgrind quando non può ricompilare con i sanitizer, ha bisogno di un tracciamento preciso dei valori non inizializzati o desidera un secondo parere. Altrimenti, per la CI di routine, ASan è solitamente più veloce.

Verifica rapida

Ricordi le categorie delle perdite.

Riepilogo

Ha imparato le basi di Valgrind.

  • Memcheck rileva perdite, accessi non validi e letture di valori non inizializzati senza ricompilare
  • Lo esegua con --leak-check=full --track-origins=yes
  • Tipi di perdita: persa definitivamente, persa indirettamente, ancora raggiungibile
  • È più lento di ASan, ma ottimo per i bug causati da valori non inizializzati

Domande Frequenti

La lezione «Nozioni di base su Valgrind» è gratuita?

Sì — il testo completo di «Nozioni di base su Valgrind» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Nozioni di base su Valgrind»?

Rilevare memory leak ed errori Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Nozioni di base su Valgrind»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Usare gdb e lldb
  2. AddressSanitizer
  3. UBSan e TSan
  4. Nozioni di base su Valgrind
← Torna a C++ Academy