Modernes C++ und C-Alternativen

RAII und automatische Freigabe von Ressourcen in C++

In dieser Lektion vergleichst du das sichere Schließen einer Datei in C mit der RAII-Technik von C++, bei der Ressourcen automatisch freigegeben werden.

Einführung

RAII (Resource Acquisition Is Initialization) ist die Technik, die Lebensdauer einer Ressource wie einer Datei, eines Speicherbereichs oder einer Verbindung an die Lebensdauer eines Objekts zu binden. Wird das Objekt zerstört, wird die Ressource auf jedem Weg aus dem Block automatisch freigegeben, selbst wenn eine Ausnahme auftritt.

Wichtige Punkte

  • Verstehe zuerst, wie es in C funktioniert, bevor du die Abstraktionen von C++ lernst.
  • Drücke den Besitz von Ressourcen mit RAII und Wertsemantik (value semantics) aus.
  • Bevorzuge die typsicheren Werkzeuge von C++ gegenüber Makros und Typumwandlungen.

Codebeispiele in C und C++

C
Code ausführen →
main.c
#include <stdio.h>

int main(void) {
    int result = 1;
    FILE *file = fopen("scores.txt", "w");
    if (!file) goto cleanup;
    if (fputs("Ada 95\n", file) < 0) goto cleanup;
    result = 0;

cleanup:
    if (file) fclose(file);
    puts(result ? "failed" : "saved");
    return result;
}
Ergebnis der Ausführung
saved
C++
Code ausführen →
main.cpp
#include <fstream>
#include <iostream>

int main() {
    std::ofstream file("scores.txt");
    if (!file) return 1;
    file << "Ada 95\n";
    std::cout << "saved\n";
}
Ergebnis der Ausführung
saved

C und C++ im Vergleich

In C verwendet das Programm das Label cleanup und die Anweisung goto, damit jeder Weg, ob Erfolg oder Fehler, über das fclose läuft, das die Datei schließt. In C++ schließt std::ofstream die Datei im Destruktor (destructor), sobald die Variable file den Gültigkeitsbereich verlässt. So wird die Ressourcenverwaltung übersichtlicher und die Gefahr sinkt, das Freigeben zu vergessen.

C

C verwendet Namenskonventionen, Callbacks, Makros und structs mit Kontext.

C++

C++ bietet Abstraktionen mit klarem Gültigkeitsbereich, die typsicher sind und zur Laufzeit meist nichts zusätzlich kosten.

Übungen zur Vertiefung

Führe beide Versionen aus und ändere dann den Code, um zu beobachten, welche Sicherheit jede Sprache bietet.

  • Schreibe den Mechanismus zuerst in C und verwende erst dann die entsprechende C++-Funktion.
  • Ersetze das manuelle Freigeben von Ressourcen durch RAII.
  • Prüfe, ob die Funktion Speicherreservierungen oder Aufrufe virtueller Funktionen verursacht.

Mit einer Challenge üben

Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.

Alle Challenges