Anhang C. Resource Acquisition Is Initialization

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 }
Listing C.1 Resource-Management mit RAII

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:

Ressource-Management-Verhalten