Scope Guards in C 11
Einer der Hauptvorteile von C 11-Lambda-Ausdrücken liegt in ihrer Fähigkeit, das Konzept von RAII auszudrücken ( Ressourcenbeschaffung ist Initialisierung) auf prägnante und elegante Weise. Die traditionelle Implementierung von RAII basiert auf Destruktoren, um Ressourcen freizugeben. Mit Lambda-Ausdrücken ist es jedoch möglich, ein Objekt zu erstellen, das beim Verlassen seines Bereichs eine Bereinigungsfunktion ausführt, unabhängig davon, wie dieser Verlassen erfolgt. Dies wird als Scope Guard bezeichnet.
Einfache Scope Guard-Implementierung
Hier ist ein Beispiel für eine einfache Scope Guard-Implementierung in C 11:
templateDie ScopeGuard-Klasse verwendet einen Lambda-Ausdruck als Konstruktorargument, der die Bereinigungsaktion darstellt, die ausgeführt werden soll, wenn der Bereichswächter den Gültigkeitsbereich verlässt. Das Committed-Flag zeigt an, ob die Bereinigungsaktion ausgeführt wurde.
Verwendung
Die ScopeGuard-Klasse kann verwendet werden, um sicherzustellen, dass Ressourcen ordnungsgemäß freigegeben werden, auch wenn eine Ausnahme auftritt . Beispielsweise ruft die folgende Funktion eine Ressource ab und stellt mithilfe eines Bereichsschutzes sicher, dass sie freigegeben wird:
void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions()
{
std::vector<int> myVec;
std::vector<int> someOtherVec;
myVec.push_back(5);
//first constructor, adquire happens elsewhere
const auto& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } );
//sintactically neater, since everything happens in a single line
const auto& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); }
, [&]() { someOtherVec.pop_back(); } );
b.commit();
a.commit();
}
In diesem Beispiel wird der ScopeGuard verwendet, um sicherzustellen, dass die Elemente aus den Vektoren entfernt werden, auch wenn eine Ausnahme auftritt.
Fazit
Scope Guards sind ein leistungsstarkes Tool, um sicherzustellen, dass Ressourcen in C 11 ordnungsgemäß freigegeben werden. Die hier vorgestellte einfache Implementierung ist eine unkomplizierte Möglichkeit, dieses Muster zu implementieren. Es gibt jedoch komplexere Implementierungen, die zusätzliche Funktionen bieten, z. B. die Möglichkeit, den Besitz von Ressourcen zwischen Bereichswächtern zu übertragen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3