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++
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;
}
saved
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";
}
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.