Bei RAII geht es zum Teil darum zu entscheiden, wann ein Objekt für seine eigene Bereinigung verantwortlich wird. Die Regel lautet, dass das Objekt verantwortlich wird, wenn die Konstruktorinitialisierung abgeschlossen ist. Die Symmetrie von Initialisierung und Bereinigung, Konstruktor und Destruktor, bedeutet, dass die beiden eng miteinander verbunden sind.
Ein Punkt von RAII ist die Gewährleistung der Ausnahmesicherheit - dass die Anwendung selbstkonsistent bleibt, wenn Ausnahmen ausgelöst werden. Auf den ersten Blick ist dies trivial - wenn eine Ausnahme das Verlassen eines Gültigkeitsbereichs verursacht, müssen die lokalen Variablen in diesem Gültigkeitsbereich zerstört werden.
Aber was passiert, wenn der Ausnahmewurf innerhalb eines Konstruktors auftritt?
Nun, das Objekt wurde noch nicht vollständig konstruiert und kann daher nicht sicher zerstört werden. Der Konstruktor sollte nach Bedarf über Try-Blöcke verfügen, um sicherzustellen, dass alle erforderlichen Bereinigungen durchgeführt werden, bevor die Ausnahme propogiert wird. Sobald die Ausnahme außerhalb des Bereichs auftritt, in dem das Objekt erstellt wurde, erfolgt kein Destruktoraufruf, da das Objekt nicht an erster Stelle erstellt wurde.
Berücksichtigen Sie insbesondere die Konstruktoren für Elementdaten innerhalb des zu zerstörenden Objekts. Wenn einer dieser Auslöser eine Ausnahme auslöst, wird Ihr Hauptkonstruktorcode überhaupt nicht ausgeführt, aber ein Code, der einen impliziten Teil dieses Konstruktors bildet, wird über Folgendes verfügen. Alle Mitglieder, die erfolgreich erstellt wurden, werden automatisch zerstört. Elemente, die nicht erstellt wurden (einschließlich desjenigen, der die Ausnahme ausgelöst hat), sind es nicht.
Grundsätzlich ist RAII eine Richtlinie, die sicherstellt, dass alles, was vollständig konstruiert wurde, rechtzeitig zerstört wird, insbesondere wenn Ausnahmewürfe vorliegen, und dass jedes Objekt vollständig konstruiert wird oder nicht (es gibt keine Halbbilder). konstruierte Objekte, die Sie nicht sicher bereinigen können). Zugewiesene Ressourcen werden ebenfalls freigegeben. Und ein Großteil der Arbeit ist automatisiert, sodass sich der Programmierer nicht zu viele Sorgen machen muss.