0Pricing
C++ Academy · Lektion

Valgrind-Grundlagen

Leaks und Fehler erkennen

Valgrind-Grundlagen ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist Valgrind?

Valgrind ist ein Instrumentierungsframework. Sein Standardtool Memcheck erkennt Speicherlecks und Speicherfehler ohne Neukompilierung, indem es Ihr Programm auf einer simulierten CPU ausführt.

Memcheck ausführen

Rufen Sie Valgrind vor Ihrem Programm auf. Erstellen Sie den Build zuvor mit -g, damit Zeilennummern verfügbar sind.

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

Lecks erkennen

Memcheck meldet Speicher, der beim Beenden noch reserviert ist, und klassifiziert ihn als definitiv verloren, indirekt verloren oder weiterhin erreichbar.

#include <cstdlib>

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

Leckkategorien

Machen Sie sich mit den Kategorien des Berichts vertraut.

  • Definitely lost: Kein Zeiger ist mehr vorhanden; ein echtes Leck
  • Indirectly lost: Nur über einen verlorenen Block erreichbar
  • Still reachable: Beim Beenden existiert ein Zeiger (oft unproblematisch)

Ungültige Lese- und Schreibzugriffe

Memcheck erkennt Zugriffe auf nicht reservierten oder bereits freigegebenen Speicher und meldet Adresse und Größe.

#include <cstdlib>

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

Nicht initialisierte Werte

Memcheck warnt, wenn eine Bedingung oder Ausgabe von einem nicht initialisierten Wert abhängt. Das ist eine häufige Ursache für nichtdeterministische Fehler.

#include <iostream>

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

Die Ausgabe lesen

Jeder Fehlerblock zeigt den Vorgang, den fehlerhaften Stacktrace und bei Heap-Blöcken die Stelle, an der der Speicher reserviert wurde. HEAP SUMMARY fasst Reservierungen und Lecks zusammen.

Nützliche Optionen

Häufig verwendete Optionen:

  • --leak-check=full: Details zu jedem Leck
  • --show-leak-kinds=all
  • --track-origins=yes: nicht initialisierte Werte bis zu ihrer Quelle zurückverfolgen
  • --error-exitcode=1: CI bei Fehlern fehlschlagen lassen

Valgrind und ASan im Vergleich

Beide finden Speicherfehler, allerdings mit unterschiedlichen Vor- und Nachteilen.

  • Valgrind: keine Neukompilierung nötig, langsamer (10- bis 50-fach), erkennt nicht initialisierte Lesezugriffe besonders gut
  • ASan: Neukompilierung nötig, deutlich schneller, bessere Erkennung von Stack-Überläufen

Bekannte Probleme unterdrücken

Drittanbieterbibliotheken können störende Meldungen erzeugen. Erstellen und verwenden Sie mit --gen-suppressions=all und --suppressions=file eine Suppressionsdatei, um bekannte harmlose Berichte auszublenden.

Wann Sie Valgrind verwenden sollten

Verwenden Sie Valgrind, wenn Sie nicht mit Sanitizern neu kompilieren können, eine präzise Rückverfolgung nicht initialisierter Werte benötigen oder eine zweite Einschätzung wünschen. Andernfalls ist ASan für routinemäßige CI-Läufe meist schneller.

Schnelltest

Rufen Sie sich die Leckkategorien in Erinnerung.

Zusammenfassung

Sie haben die Grundlagen von Valgrind kennengelernt.

  • Memcheck findet Lecks, ungültige Zugriffe und nicht initialisierte Lesezugriffe, ohne dass eine Neukompilierung nötig ist
  • Führen Sie es mit --leak-check=full --track-origins=yes aus
  • Leckarten: definitiv verloren / indirekt verloren, weiterhin erreichbar
  • Langsamer als ASan, aber hervorragend zum Finden von Fehlern mit nicht initialisierten Werten geeignet

Häufig gestellte Fragen

Ist die Lektion „Valgrind-Grundlagen“ kostenlos?

Ja — der vollständige Text von „Valgrind-Grundlagen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Valgrind-Grundlagen“?

Leaks und Fehler erkennen Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Valgrind-Grundlagen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. gdb und lldb verwenden
  2. AddressSanitizer
  3. UBSan und TSan
  4. Valgrind-Grundlagen
← Zurück zu C++ Academy