Einleitung: Warum C++ schwierig, aber interessant ist
C++ ist eine der leistungsstärksten und performantesten Programmiersprachen. Aber mit großer Macht kommt große Verantwortung. Anfänger stoßen oft auf Fehler, die zu Programmabstürzen, Speicherlecks und undefiniertem Verhalten führen können. In diesem Artikel werden wir die 10 häufigsten Fehler von Anfängern in C++ von A bis Z analysieren. Sie werden lernen, wie Sie sie erkennen, beheben und – am wichtigsten – in Zukunft vermeiden können. Dieses Material ist sowohl für Studenten als auch für diejenigen nützlich, die gerade ihre Reise in die Systemprogrammierung beginnen.
1. Ignorieren von undefiniertem Verhalten (UB)
Einer der tückischsten Fehler ist undefiniertes Verhalten (UB). Der Compiler gibt keine Warnung aus, das Programm scheint "normal" zu funktionieren, aber wenn Optimierungen oder Plattformen geändert werden, stürzt alles ab.
Beispiel: Array-Zugriff außerhalb der Grenzen
int arr[5] = {1, 2, 3, 4, 5};arr[5] = 42; // UB: Schreiben außerhalb der Grenzenstd::cout << arr[10]; // UB: Lesen von MüllWie man es vermeidet: Verwenden Sie immer std::array oder std::vector mit Grenzüberprüfung via .at() sowie STL-Container. Verlassen Sie sich niemals auf "Glück" — UB kann im ungünstigsten Moment auftreten.
2. Speicherlecks und rohe Zeiger
C++ hat keinen Garbage Collector. Jedes new muss ein passendes delete haben. Anfänger vergessen oft, Speicher freizugeben, besonders wenn Ausnahmen auftreten.
Beispiel eines Lecks
void leak() { int* p = new int(100); // delete p vergessen; // Speicher geht verloren, wenn die Funktion beendet wird}Lösung: Verwenden Sie intelligente Zeiger: std::unique_ptr für exklusiven Besitz und std::shared_ptr für gemeinsamen Besitz. Diese geben Speicher automatisch frei, wenn sie den Gültigkeitsbereich verlassen.
void no_leak() { auto p = std::make_unique<int>(100); // delete wird automatisch aufgerufen}3. Falsche Verwendung von Referenzen und Zeigern
Verwirrung zwischen Referenzen (&) und Zeigern (*) ist ein häufiges Problem.
- Referenz ist ein Alias. Sie kann nicht
nullptrsein und kann nicht neu zugewiesen werden. - Zeiger kann null sein und auf verschiedene Objekte zeigen.
Typischer Fehler: Rückgabe einer Referenz auf ein lokales Objekt
int& bad_ref() { int x = 10; return x; // x wird nach der Rückgabe zerstört}// Verwendung: int& r = bad_ref(); // hängende ReferenzRegel: Geben Sie niemals Referenzen oder Zeiger auf lokale Variablen zurück. Geben Sie nur Daten zurück, deren Lebensdauer garantiert ist (z. B. per Referenz übergebene Argumente oder statische Variablen).
4. Vernachlässigung von RAII (Ressourcenbelegung ist Initialisierung)
RAII ist ein zentrales C++-Idiom. Eine Ressource (Speicher, Datei, Mutex) wird im Konstruktor belegt und im Destruktor freigegeben. Anfänger schreiben oft manuelle Verwaltung, was bei Ausnahmen zu Lecks führt.
Schlechtes Beispiel
void handle_file() { FILE* f = fopen("data.txt", "r"); // ... Arbeit mit Datei ... if (some_error) { return; // fclose vergessen! } fclose(f);}Gutes Beispiel mit RAII
void handle_file_safe() { std::ifstream f("data.txt"); if (!f) return; // ... Arbeit ... // Datei wird beim Verlassen des Gültigkeitsbereichs automatisch geschlossen}Fazit: Wickeln Sie Ressourcen immer in RAII-Wrapper. Für Dateien — std::fstream, für Speicher — intelligente Zeiger, für Mutexe — std::lock_guard.
5. Ignorieren von const und constexpr
Viele Anfänger verwenden nicht