RAII: Ressourcenakquisition ist Initialisierung

Download c++ eBook

Bemerkungen

RAII steht für R eSource Ü bernahme I s I nitialization. RAII, gelegentlich auch als SBRM (Scope-Based Resource Management) oder RRID (Resource Release Is Destruction) bezeichnet, ist ein Idiom, mit dem Ressourcen an die Lebensdauer des Objekts gebunden werden. In C ++ wird der Destruktor für ein Objekt immer ausgeführt, wenn ein Objekt seinen Gültigkeitsbereich verlässt - wir können dies nutzen, um die Ressourcenbereinigung mit der Objektzerstörung zu verknüpfen.

Jedes Mal, wenn Sie eine Ressource (z. B. eine Sperre, ein Dateihandle, einen zugewiesenen Puffer) benötigen, die Sie eventuell freigeben müssen, sollten Sie ein Objekt zur Verwaltung dieser Ressourcenverwaltung in Betracht ziehen. Das Abwickeln des Stapels wird unabhängig von der Ausnahme oder dem vorzeitigen Beenden des Bereichs ausgeführt. Daher bereinigt das Ressourcenhandlerobjekt die Ressource für Sie, ohne dass Sie alle möglichen aktuellen und zukünftigen Codepfade sorgfältig prüfen müssen.

Es ist erwähnenswert, dass RAII den Entwickler nicht völlig frei macht, über die Lebensdauer von Ressourcen nachzudenken. Ein Fall ist offensichtlich ein Absturz- oder Beendigungsaufruf (), der den Aufruf von Destruktoren verhindert. Da das Betriebssystem nach dem Beenden eines Prozesses prozesslokale Ressourcen wie Speicher bereinigt, ist dies in den meisten Fällen kein Problem. Bei Systemressourcen (z. B. Named Pipes, Sperrdateien, Shared Memory) benötigen Sie jedoch noch Einrichtungen, um den Fall zu bewältigen, dass ein Prozess nicht nach sich selbst bereinigt wird, dh beim Starttest, ob die Sperrdatei vorhanden ist. Überprüfen Sie, ob der Prozess tatsächlich vorhanden ist, und handeln Sie entsprechend.

Eine andere Situation ist, wenn ein Unix-Prozess eine Funktion aus der Exec-Familie aufruft, dh nach einem Fork-Exec, um einen neuen Prozess zu erstellen. Der untergeordnete Prozess verfügt über eine vollständige Kopie des übergeordneten Speichers (einschließlich der RAII-Objekte). Sobald exec jedoch aufgerufen wurde, wird keiner der Destruktoren in diesem Prozess aufgerufen. Wenn dagegen ein Prozess verzweigt ist und keiner der Prozesse exec aufgerufen hat, werden alle Ressourcen in beiden Prozessen bereinigt. Dies gilt nur für alle Ressourcen, die tatsächlich in der Verzweigung dupliziert wurden. Bei Systemressourcen haben beide Prozesse jedoch nur einen Verweis auf die Ressource (dh den Pfad zu einer Sperrdatei). Beide versuchen, sie einzeln freizugeben, was möglicherweise dazu führt der andere Prozess zum Scheitern verurteilt.

Verwandte Beispiele

Stats

681 Contributors: 10
Tuesday, November 1, 2016
Lizenziert unter: CC-BY-SA

Nicht angeschlossen an Stack Overflow
Rip Tutorial: info@zzzprojects.com

EBook herunterladen