Ressourcenbelegung ist Initialisierung - LinkFang.de





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 zur Verwaltung von Betriebsmitteln (auch Ressourcen genannt). Dabei wird die Belegung von Betriebsmitteln an den Konstruktoraufruf einer Variablen eines benutzerdefinierten Typs und die Freigabe der Betriebsmittel an dessen Destruktoraufruf gebunden. Die automatische Freigabe wird beispielsweise durch das Verlassen des Gültigkeitsbereichs ausgelöst (am Blockende, bei Ausnahmeauslösung, durch Rückgabe an den Aufrufer usw.), der implizite Destruktoraufruf der Variablen sorgt dann für die Wiederfreigabe der Ressource.

Typische Einsatzfälle für RAII sind die Steuerung von Prozess- oder Thread-Sperren in nebenläufigen Programmen und die Verwaltung von Datei-Operationen. Da Destruktoren auch unter Ausnahmebedingungen automatisch aufgerufen werden, ist RAII auch ein Schlüsselkonzept zum Schreiben von ausnahmefestem Code.

Zu den Programmiersprachen, die die Anwendung der Programmiertechnik RAII ermöglichen, gehören beispielsweise C++, Ada, D und Rust. In C# oder Java ist diese Technik dagegen aufgrund des nebenläufigen Garbage Collectors nicht direkt möglich (siehe Abschnitt Varianten).

Beispiel

Das folgende Beispielprogramm ist in der Programmiersprache C++ verfasst:

#include <string>
#include <cstdio>
 
class Datei {
    FILE* datei_;
 
public:
    Datei(const std::string& name)
    : datei_( std::fopen(name.c_str(), "w+") ) {} // Öffnen der Datei
 
    ~Datei() {
         std::fclose(datei_); // Schließen der Datei
    }
 
    void Ausgabe(const std::string& text) {
        if (datei_)
            std::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.
}

Zweites Beispiel

nicht RAII:

void func(void)
{
    char* buffer = new char[3];
    buffer[0] = 'A';
    buffer[1] = 'B';
    buffer[2] = 'C';
 
    // buffer verwenden
 
    delete[] buffer;
}

RAII:

void func(void)
{
    std::vector<char> buffer = {'A', 'B', 'C'};
 
    // buffer verwenden   
}

Varianten

Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung.

Das korrekte Funktionieren dieser Technik hängt wesentlich von den Eigenschaften der Konstruktoren und Destruktoren der Sprache ab. In C++ wird durch den Sprachstandard garantiert, dass ein Objekt beim Durchlaufen seiner Deklaration erstellt und dabei sein Konstruktor aufgerufen wird. Beim Verlassen seines Gültigkeitsbereichs muss das Objekt zerstört werden, d. h. sein Destruktor wird aufgerufen und kann die Freigabe von Ressourcen veranlassen.[1] Dass ein Destruktor aufgerufen wird kann allerdings in keiner Programmiersprache garantiert werden, da Programme immer abnormal z.B. durch Stromausfall oder SIGKILL beendet werden können.

Dieser Artikel oder Abschnitt ist nicht ausreichend belegt.

Auch Programmiersprachen mit Garbage Collection, wie z. B. C# oder Java, garantieren nicht dass ein nicht mehr referenziertes Objekt durch den Garbage Collector freigegeben wird. Der Zeitpunkt, an dem ein Objekt zerstört und die Finalisierungsmethode aufgerufen wird, ist bei nebenläufiger Garbage Collection nicht mehr deterministisch. Dadurch kann das Objekt eine Ressource länger belegen als eigentlich erwartet, d. h. auch über seinen Gültigkeitsbereich hinaus. Allgemein kann dieses Problem nur umgangen werden, indem explizit eine Funktion zur Freigabe der Ressourcen aufgerufen wird oder spezielle Sprachkonstrukte verwendet werden.[2][3][4]

Die für C# empfohlene Alternative ist, die Implementierung des System.IDisposable-Interfaces – auch Dispose Pattern genannt. Bei Verwendung mithilfe des Schlüsselworts using wird sichergestellt, dass die Methode Dispose() am Ende des Gültigkeitsbereichs aufgerufen wird und damit belegte Ressourcen zu einem definierten Zeitpunkt freigegeben werden.

In Java kann mithilfe der try-with-resources-Anweisung ähnlich sichergestellt werden, dass Ressourcen am Ende eines Gültigkeitsbereichs in umgekehrter Reihenfolge wieder freigegeben werden.[5][6]

Weblinks

Einzelnachweise

  1. B. Strousroup: Die C++-Programmiersprache, S. 259f, S. 390 f., 4. Auflage, Addison-Wesley, ISBN 978-3-827-31756-8
  2. Nagel, Elvin, et al.: C# 2012 and .NET 4.5, S. 353 ff., John Wiley & Sons, 2013, ISBN 978-1-118-31442-5
  3. A. Jones, et al.: Visual C# 2010 Recipes: A Problem-Solution Approach, S. 647 ff., 2010, Apress
  4. F. Eller: Visual C sharp 2010, S. 200 f., 2010, Pearson Deutschland
  5. Oracle Java Tutorial: The try-with-resources Statement
  6. Java Language Specification: Chapter 14, Blocks and Statements, try-with-resources

Kategorien: Entwurfsmuster | C++

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Ressourcenbelegung ist Initialisierung (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.