Top-Fehler von C++-Anfängern
C++ ist eine mächtige, aber anspruchsvolle Sprache. Sie gibt dem Programmierer die volle Kontrolle über Speicher und Leistung, doch für diese Freiheit muss man mit hoher Verantwortung bezahlen. Anfänger machen oft dieselben Fehler, die zu Speicherlecks, undefiniertem Verhalten und schwer zu findenden Bugs führen. In diesem Artikel analysieren wir die 4 häufigsten Fehler von C++-Anfängern und zeigen, wie man sie vermeidet.
1. Speicherlecks und falsche Ressourcenverwaltung
Das häufigste Problem ist, nach new das delete zu vergessen. Die Folge: Der Speicher wird nicht freigegeben, und die Anwendung verbraucht immer mehr Ressourcen.
Beispiel für einen Fehler:
void leakExample() { int* ptr = new int(42); // ... irgendein Code ... // delete ptr; vergessen}Jeder Aufruf einer solchen Funktion „verliert“ 4 Bytes. Bei langlebigen Programmen führt das zur Speichererschöpfung.
Die richtige Lösung – RAII und Smart Pointer:
#include <memory>
void safeExample() { std::unique_ptr<int> ptr = std::make_unique<int>(42); // Der Speicher wird automatisch freigegeben, wenn die Funktion verlassen wird}Verwenden Sie std::unique_ptr für Alleinbesitz und std::shared_ptr für geteilten Zugriff. Verwenden Sie in modernem C++ niemals rohe new und delete.
2. Verwechslung von Zeigern und Referenzen
Anfänger verstehen oft den Unterschied zwischen T* und T& nicht. Der Hauptunterschied: Eine Referenz kann nicht nullptr sein, sie kann nicht neu zugewiesen werden und zeigt immer auf ein gültiges Objekt.
Beispiel für eine Verwechslung:
void process(int* ptr) { if (ptr) { *ptr = 10; // OK }}
int main() { int a = 5; process(&a); // Funktioniert process(nullptr); // Funktioniert auch, kann aber ein Bug sein}Hier nimmt die Funktion einen Zeiger entgegen, erwartet aber logisch ein gültiges Objekt. Besser ist es, eine Referenz zu verwenden:
void process(int& ref) { ref = 10; // Immer sicher}
int main() { int a = 5; process(a); // Eindeutig und klar // process(nullptr); // Compiler-Fehler – genau das, was wir wollen!}Faustregel: Verwenden Sie Referenzen überall dort, wo das Objekt zwingend existieren muss. Zeiger heben Sie sich für optionale Parameter oder dynamische Arrays auf.
3. Ignorieren der const-Korrektheit
Viele Anfänger vergessen const. Dies führt dazu, dass Funktionen keine temporären Objekte annehmen können und der Compiler den Code nicht optimieren kann.
Beispiel für einen Fehler:
void printVector(std::vector<int>& vec) { for (int v : vec) { std::cout << v << " "; }}
int main() { printVector({1, 2, 3}); // Fehler! Ein temporäres Objekt kann nicht an eine nicht-konstante Referenz gebunden werden}Die richtige Lösung:
void printVector(const std::vector<int>& vec) { for (int v : vec) { std::cout << v << " "; }}
int main() { printVector({1, 2, 3}); // Funktioniert!}Fügen Sie immer const zu Parametern hinzu, die nicht geändert werden sollen. Das macht den Code sicherer und verständlicher.
4. Falsche Verwendung von Strings und Vergessen von std::string
Anfänger verwenden oft C-Strings (char*) und schreiben eigene Funktionen dafür, obwohl C++ die mächtige Klasse std::string bietet.
Beispiel für gefährlichen Code:
void unsafeConcat(char* dest, const char* src) { strcat(dest, src); // Pufferüberlauf leicht gemacht!}
int main() { char buffer[10];```