www.wikidata.de-de.nina.az
Ressourcenbelegung ist Initialisierung meist abgekurzt durch RAII 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 Gultigkeitsbereichs ausgelost am Blockende bei Ausnahmeauslosung durch Ruckgabe an den Aufrufer usw der implizite Destruktoraufruf der Variablen sorgt dann fur die Wiederfreigabe der Ressource Inhaltsverzeichnis 1 Anwendung 2 Beispiel 3 Zweites Beispiel 4 Varianten 5 Weblinks 6 EinzelnachweiseAnwendung BearbeitenTypische Einsatzfalle fur RAII sind die Steuerung von Prozess oder Thread Sperren in nebenlaufigen Programmen und die Verwaltung von Datei Operationen Da Destruktoren auch unter Ausnahmebedingungen automatisch aufgerufen werden ist RAII auch ein Schlusselkonzept zum Schreiben von ausnahmefestem Code Zu den Programmiersprachen die die Anwendung der Programmiertechnik RAII ermoglichen gehoren beispielsweise C Ada D und Rust In C oder Java ist diese Technik dagegen nicht direkt moglich da dort die Destruktion aller Objekte von einem nebenlaufigen Garbage Collector verwaltet wird siehe Abschnitt Varianten Beispiel BearbeitenDas folgende Beispielprogramm ist in der Programmiersprache C verfasst include lt string gt include lt cstdio gt class Datei FILE datei public Datei const std string amp name datei std fopen name c str w Offnen der Datei Datei std fclose datei Schliessen der Datei void ausgeben const std string amp text if datei std fputs text c str datei int main Datei datei aufzeichnung txt Offnen der Datei Anfordern der Ressource datei ausgeben Hallo Welt Mit dem Ende der Funktion endet auch der Gultigkeitsbereich Scope des Objekts datei Daher wird der Destruktor Datei Datei aufgerufen der die Datei schliesst Freigabe der Ressource Zweites Beispiel Bearbeitennicht 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 lt char gt buffer A B C buffer verwenden Varianten Bearbeiten nbsp Dieser Artikel oder Abschnitt bedarf einer grundsatzlichen Uberarbeitung Naheres sollte auf der Diskussionsseite angegeben sein Bitte hilf mit ihn zu verbessern und entferne anschliessend diese Markierung Das korrekte Funktionieren dieser Technik hangt 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 Gultigkeitsbereichs muss das Objekt zerstort 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 konnen In solchen Fallen kann allerdings keine Programmiertechnik die korrekte Freigabe der Ressourcen sicherstellen nbsp Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen beispielsweise Einzelnachweisen ausgestattet Angaben ohne ausreichenden Beleg konnten demnachst entfernt werden Bitte hilf Wikipedia indem du die Angaben recherchierst und gute Belege einfugst Bitte um Beleg dass ein nebenlaufiger und somit nicht zeitlich vorhersagbarer Aufruf des Destruktors Finalizers RAII unmoglich macht und auch nur dann wenn es sich bei dem nebenlaufigen Prozess um einen Garbage Collector handelt Siehe auch Diskussion Ressourcenbelegung ist Initialisierung RAII vs Separation of Concerns Programmiersprachen mit Garbage Collection wie z B C oder Java machen keine Garantien bezuglich des Zeitpunkts zu dem ein nicht mehr referenziertes Objekt durch den Garbage Collector freigegeben wird Dieser Zeitpunkt zu dem ein Objekt zerstort und die Finalisierungsmethode aufgerufen wird ist bei nebenlaufiger Garbage Collection auch nicht mehr deterministisch Dadurch kann das Objekt eine Ressource langer belegen als eigentlich erwartet insbesondere auch uber seinen Gultigkeitsbereich hinaus Allgemein kann dieses Problem nur umgangen werden indem explizit eine Funktion zur Freigabe der Ressourcen aufgerufen wird und oder spezielle Sprachkonstrukte verwendet werden 2 3 4 Die fur C empfohlene Alternative ist die Implementierung des System IDisposable Interfaces auch Dispose Pattern genannt Bei Verwendung des using Blocks wird sichergestellt dass die Methode Dispose am Ende dieses Blocks aufgerufen wird um belegte Ressourcen zu einem definierten Zeitpunkt freizugeben In Java kann mithilfe der try with resources Anweisung ahnlich sichergestellt werden dass Ressourcen am Ende eines Gultigkeitsbereichs in umgekehrter Reihenfolge wieder freigegeben werden 5 6 Weblinks BearbeitenBeispielkapitel Gotcha 67 Failure to Employ Resource Acquisition Is Initialization von Stephen Dewhurst englisch Interview A Conversation with Bjarne Stroustrup von Bill Venners englisch Einzelnachweise Bearbeiten Bjarne Stroustrup Die C Programmiersprache 4 aktualisierte und erweiterte Auflage Addison Wesley Munchen Boston 2000 ISBN 3 8273 1660 X S 259 f S 390 f Christian Nagel Bill Evjen Jay Glynn Karli Watson Morgan Skinner C 2012 and NET 4 5 John Wiley amp Sons Indianapolis 2013 ISBN 978 1 118 31442 5 S 353 ff Allen Jones Adam Freeman Visual C 2010 Recipes A Problem Solution Approach Apress Springer New York 2010 ISBN 978 1 4302 2525 6 S 647 ff Frank Eller Visual C sharp 2010 Pearson Deutschland Munchen 2010 S 200 f Oracle Java Tutorial The try with resources Statement Java Language Specification Chapter 14 Blocks and Statements try with resources Abgerufen von https de wikipedia org w index php title Ressourcenbelegung ist Initialisierung amp oldid 242661557