- Ressourcenbelegung ist Initialisierung
-
Ressourcenbelegung ist Initialisierung, meist abgekürzt durch RAII, für englisch resource acquisition is initialization, bezeichnet eine in bestimmten Programmiersprachen (wie z. B. C++) verbreitete Programmiertechnik. Dabei wird die Steuerung der Belegung und der Freigabe von Betriebsmitteln (auch Ressourcen genannt) an den Gültigkeitsbereich von Variablen gekoppelt.
Die Belegung einer Ressource ist an den Konstruktoraufruf einer Variablen eines benutzerdefinierten Typs gebunden. Die automatische Freigabe wird durch das Verlassen des Gültigkeitsbereichs ausgelöst (am Blockende, bei Ausnahmeauslösung, durch Rückgabe an den Aufrufer, usw.). Dabei sorgt der implizite Destruktoraufruf der Variablen für die Wiederfreigabe der Ressource.
Ein typischer Einsatzfall für RAII ist die Verwaltung von Datei-Operationen und die Steuerung von Prozess- oder Thread-Sperren in nebenläufigen Programmen. Da Destruktoren von Variablen benutzerdefinierter Typen beim Verlassen des Gültigkeitsbereiches insbesondere auch unter Ausnahmebedingungen automatisch aufgerufen werden, ist RAII auch ein Schlüsselkonzept zum Schreiben von ausnahmefestem Code.
Alle Sprachen mit benutzerdefinierbaren Konstruktoren und Destruktoren ermöglichen die Anwendung der Programmiertechnik RAII. Dazu gehören beispielsweise C++, Ada und D.
In C++ kann auch die Eigentümerschaft von mit new erworbenem Speicher über diese Technik gesteuert werden. In der C++-Standardbibliothek ist zu diesem Zweck beispielsweise auto_ptr definiert.
Beispiel
Das folgende Beispielprogramm ist in der Programmiersprache C++ verfasst:
#include <string> #include <stdio.h> class Datei { FILE* datei_; public: Datei(const std::string& name) : datei_( fopen(name.c_str(), "w+") ) {} // Öffnen der Datei ~Datei() { fclose(datei_); // Schließen der Datei } void Ausgabe(const std::string& text) { if (datei_) fputs(text.c_str(), datei_); } }; int main() { Datei datei("aufzeichnung.txt"); // Öffnen der Datei (Anfordern der Ressource) datei.Ausgabe("Hallo Welt!"); // Mit dem Ende der Funktion endet auch der Gültigkeitsbereich (Scope) // des Objekts datei. Daher wird der Destruktor Datei::~Datei() // aufgerufen, der die Datei schließt → Freigabe der Ressource }
Weblinks
- Beispielkapitel „Gotcha #67: Failure to Employ Resource Acquisition Is Initialization“ von Stephen Dewhurst (englisch)
- Interview „A Conversation with Bjarne Stroustrup“ von Bill Venners (englisch)
Wikimedia Foundation.