Modernes C++ und C-Alternativen

RAII und deterministisches Cleanup

RAII führt Cleanup bei jedem Verlassen des Gültigkeitsbereichs aus, auch bei Exceptions.

Was ist RAII und deterministisches Cleanup?

RAII führt Cleanup bei jedem Verlassen des Gültigkeitsbereichs aus, auch bei Exceptions.

Binde Ressourcen an Objektlebenszeiten.

Wichtige Punkte

  • Verstehe zuerst den C-Mechanismus.
  • Drücke Ownership durch RAII und Wertsemantik aus.
  • Bevorzuge typsichere Abstraktionen gegenüber Makros und Casts.

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;
}
Erwartete Ausgabe
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";
}
Erwartete Ausgabe
saved

Vergleich zwischen C und C++

C verwendet ein Cleanup-Label, damit jeder Pfad fclose erreicht; C++ fstream schließt im Destruktor und lokalisiert Ownership.

C

C nutzt Namenskonventionen, Callbacks, Makros und Kontextstrukturen.

C++

Sprachfeatures liefern bereichsgebundene, typsichere Abstraktionen.

Übungsaufgaben

Führe beide Versionen aus und untersuche die unterschiedlichen Garantien.

  • Implementiere zuerst den C-Mechanismus.
  • Ersetze manuelles Cleanup durch RAII.
  • Prüfe zusätzliche Allokationen und virtuellen Dispatch.