Was ist die grundlegende Sicherheitsgarantie im Kontext der C++-Standardbibliothek und wie beeinflusst sie die Ressourcenverwaltung?
sobes.tech KI
Antwort von AI
Die grundlegende Sicherheitsgarantie (grundlegende Ausnahme-Sicherheit) bedeutet, dass das Programm im Falle einer Ausnahme in einem korrekten, wenn auch nicht unbedingt vorhersehbaren Zustand bleibt. Ressourcen wie dynamischer Speicher oder Dateideskriptoren, die vor dem Auftreten der Ausnahme von Funktionen erworben wurden, werden korrekt freigegeben.
Dies wird durch die Verwendung von RAII (Resource Acquisition Is Initialization) erreicht – eine Idiom, bei der der Besitz einer Ressource mit dem Lebenszyklus des Objekts verbunden ist. Der Konstruktor des Objekts erwirbt die Ressource, und der Destruktor gibt sie frei. Beim Stack-Entrollen aufgrund einer Ausnahme werden die Destruktoren der in dem aktuellen Block erstellten Objekte automatisch aufgerufen, was die Freigabe der Ressourcen garantiert.
#include <vector>
#include <fstream>
#include <stdexcept>
void process_data(const std::string& filename) {
std::vector<int> data; // Vektor (dynamischer Speicher)
std::ifstream file(filename); // Ressource: Datei
if (!file.is_open()) {
throw std::runtime_error("Datei kann nicht geöffnet werden"); // Ausnahme: Datei kann nicht geöffnet werden
}
int value;
while (file >> value) { // Daten lesen – kann eine Ausnahme auslösen
data.push_back(value); // Kann eine Ausnahme bei Speicherknappheit auslösen
}
// Wenn eine Ausnahme vor diesem Punkt ausgelöst wird (z.B. beim Öffnen der Datei, Lesen oder Hinzufügen zum Vektor),
// werden die Destruktoren von file (schließt die Datei) und data (gibt den Speicher frei) aufgerufen,
// was die grundlegende Sicherheitsgarantie gewährleistet: Die Datei ist geschlossen, der Speicher ist freigegeben,
// aber der Zustand von data kann undefiniert sein (teilweise gefüllt).
// Weiterverarbeitung von data...
// ...
} // Die Destruktoren von file und data werden hier aufgerufen, falls keine Ausnahme ausgelöst wurde
Bei der grundlegenden Garantie:
- Alle Klasseninvarianten können verletzt werden.
- Daten können teilweise geändert werden.
- Ressourcen gehen nicht verloren.
Dies ist schwächer als die starke Garantie (der Programmzustand ändert sich bei einer Ausnahme nicht) und es gibt keine Garantie (der Programmzustand ist undefiniert, es können Lecks auftreten). In der Standardbibliothek bieten viele Operationen die grundlegende Garantie, was die minimale Anforderung für eine korrekte Arbeit mit Ausnahmen ist.