RAII



  • Warum der ganze Stress wegen RAII?

    Ich scheine die Tiefen dieses Konzepts nicht verstanden zu haben oder mir sind irgendwelche Details entgangen.

    Was steckt mehr dahinter als: Im Konstruktor Ressourcen anfordern und im Destruktor freigeben?

    Ist das alles? Was gibt's daran nicht zu verstehen? Warum muss ständig auf so etwas offensichtliches hingewiesen werden?

    Das Konzept ist so trivial, dass es kaum einen eigenen Namen verdient.



  • Ja, das Prinzip ist wirklich einfach und sehr praktisch umzusetzen. Das wird aber ständig erwähnt, weil es oft genug von Anfängern nicht verstanden wird, die javamäßig unbedingt mit new hantieren wollen. Und wenn man unter RAII googlet, findet man eben genau, wie das in C++ eben mit Scopes und Allokation/Destruktion funktioniert.



  • Ist ja nicht nur sowas wie Speicher/Files/Handles wieder freigeben/schließen, sondern man kann damit auch so Sachen wie einen Scoped-Mutex-Lock bauen.


  • Mod

    HurrDurr schrieb:

    Was steckt mehr dahinter als: Im Konstruktor Ressourcen anfordern und im Destruktor freigeben?

    Im Prinzip nichts, aber die Richtung der Implikation ist wichtig; nicht:
    wenn der Konstruktor läuft, werden die notwendigen Ressourcen angefordert (das ist tatsächlich trivial, denn dafür sind Konstruktoren nun mal da), sondern:
    wenn Ressourcen benötigt werden. wird hierfür ein Konstruktor aufgerufen. Damit wird die Ressourcenverwaltung an die Ausführung von Konstruktoren und Destruktoren gekoppelt. Und da Letzteres in C++ deterministisch und leicht überschaubar ist, gilt das damit auch für die Ressourcenverwaltung.

    Ein C- oder Javaprogrammierer muss sich um solche Dinge auf anderem Weg kümmern.



  • Eisflamme schrieb:

    Das wird aber ständig erwähnt, weil es oft genug von Anfängern nicht verstanden wird

    Nope. Es wird erwähnt, weil es einen sehr essentiellen Bestandteil der Programmiersprache bildet und einfach sehr wichtig ist. RAII sollte da ausgekostet werden, wo man es auskosten kann.

    Erst letztens gab es hier einen Code mit new/delete, in dem man zu jeder Situation ein delete hinzufügen musste, in der der Speicher freigegeben werden müsste.

    Es war schlichtweg unmöglich; nur durch RAII wurde die Lösung hundert mal unkomplizierter. Smart-Pointer. Container. Überhaupt alle ((Heap-)Resourcen) verwaltenden Klassen wären vom Konzept nicht umzusetzen.

    Merke: RAII ist die Nummer Eins, wenn es um das Schreiben von ausnahmeunabhängigem Code geht.



  • Na ja, okay, hinter RAII steckt mehr als nur nicht new/delete zu nutzen. Trotzdem fällt das Wort imo in weit >50% der Fälle, wenn Anfänger eben nicht kapieren, dass auch alles so funktioniert. Dass es ein essentielles Konzept ist, steht damit ja in keinerlei Widerspruch.



  • Sone schrieb:

    Es war schlichtweg unmöglich;

    Für manche schon, ja.

    RAII ist insbesondere wichtig, wenn auch Exceptions da sind.



  • Eisflamme schrieb:

    Dass es ein essentielles Konzept ist, steht damit ja in keinerlei Widerspruch.

    Nein, Stimmt! 🙂
    Aber du hast es so aussehen lassen, dass wir es nur ansprechen, einfach aus dem trivialen Grund dass es nicht verstanden ist. (Steht aber wiederum in keinem Widerspruch, also, gut 😃 )

    kennerdesbesagtenthreads schrieb:

    Sone schrieb:

    Für einige Leute ist es richtig schwierig, nicht zu jedem Satz ein Kommentar abzulassen.

    Für manche schon, ja.


Anmelden zum Antworten