Resource Acquisition Is Initialization, kurz RAII, bezeichnet eine beliebte Programmiertechnik in C++, bei der die Ressourcenbelegung und -freigabe an den Lebenszyklus einer Objekts gebunden werden. Konkret heißt dies, dass die Ressource – das kann ein Mutex, eine Datei oder auch dynamischer Speicher sein – im Konstruktor des Objekts initialisiert und im Destruktor wieder freigegeben wird. Das ist in C++ möglich, da insbesondere der Destruktor eines Objekts genau dann aufgerufen wird, wenn das Objekt seinen Gültigkeitsbereich verliert.
Dieses deterministische Verhalten lässt sich am besten anhand eines kleinen Programms aufzeigen:
raii.cpp
01 #include <iostream> 02 #include <string> 03 04 class ResourceGuard{ 05 private: 06 const std::string resource; 07 public: 08 ResourceGuard(const std::string& res):resource(res){ 09 std::cout << "Acquire the " << resource << "." << std::endl; 10 } 11 ~ResourceGuard(){ 12 std::cout << "Release the "<< resource << "." << std::endl; 13 } 14 }; 15 16 int main(){ 17 18 std::cout << std::endl; 19 20 // memoryBlock1 should be guarded by ResourceGuard 21 ResourceGuard resGuard1{"memoryBlock1"}; 22 23 std::cout << "\nbefore scope" << std::endl; 24 25 // resGuard2 should only be valid in following scope 26 { 27 // memoryBlock2 should be guarded by ResourceGuard 28 ResourceGuard resGuard2{"memoryBlock2"}; 29 } 30 std::cout << "after scope" << std::endl; 31 32 std::cout << std::endl; 33 34 }
In Listing C.1 wird im Konstruktor (Zeile 8) die Ressource gebunden und im Destruktor (Zeile 11) wieder freigegeben. Als Ressource wird der String MemoryBlock1
bzw. MemoryBlock2
verwendet. Mit dieser Ressource wird der ResourceGuard
(Zeilen 21 und 28) initialisiert. Schön sind in der Abbildung C.1 zwei Punkte zu sehen:
Bei der Instanziierung von resGuard1
bzw. resGuard2
wird der Konstruktoraufruf ausgeführt.
Der Destruktor wird automatisch genau dann ausgeführt, wenn das Objekt seine Gültigkeit verliert. Das ist bei resGuard1
am Ende der main
-Funktion und bei resGuard2
unmittelbar am Ende des Scopes der Zeilen 26 bis 29 der Fall.