0Pricing
C++ Academy · Lektion

Scope Guards

Beim Verlassen des Gültigkeitsbereichs aufräumen

Scope Guards ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Scope Guard?

Ein Scope Guard ist ein RAII-Objekt, dessen einzige Aufgabe darin besteht, beim Verlassen seines Gültigkeitsbereichs eine Aufräumaktion auszuführen – auch bei einer vorzeitigen Rückgabe oder einer Ausnahme.

Welches Problem er löst

Ohne Guard wird das Aufräumen nach einem vorzeitigen return oder einem throw leicht vergessen. Ein Scope Guard führt die Aktion automatisch aus.

lock_guard: Ein standardmäßiger Scope Guard

std::lock_guard sperrt einen Mutex bei der Konstruktion und entsperrt ihn bei der Destruktion – ein integrierter Scope Guard für Sperren.

#include <mutex>

std::mutex m;

void critical() {
    std::lock_guard<std::mutex> lk(m);   // locked
    // ... work ...
}                                        // unlocked automatically

Ein selbst implementierter Guard

Sie können einen Guard schreiben, der eine Funktion speichert und sie im Destruktor aufruft.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    ~ScopeGuard() { fn(); }
};

int main() {
    ScopeGuard g([] { std::cout << "cleanup\n"; });
    std::cout << "work\n";
}

Aufräumen bei vorzeitiger Rückgabe

Da der Destruktor beim Verlassen des Gültigkeitsbereichs ausgeführt wird, läuft die Aktion des Guards unabhängig davon, wie die Funktion beendet wird.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    ~ScopeGuard() { fn(); }
};

void run(bool stop) {
    ScopeGuard g([] { std::cout << "always cleaned\n"; });
    if (stop) return;
}

int main() { run(true); }

Aufräumen bei einer Ausnahme

Wenn eine Ausnahme den Gültigkeitsbereich entrollt, wird der Destruktor des Guards trotzdem ausgeführt und gibt die Ressource sicher frei.

Einen Guard deaktivieren

Manchmal möchten Sie das Aufräumen überspringen, etwa wenn die Operation erfolgreich war. Echte Guards bieten eine Methode dismiss(), um die Aktion zu deaktivieren.

#include <iostream>
#include <functional>

class ScopeGuard {
    std::function<void()> fn;
    bool active = true;
public:
    ScopeGuard(std::function<void()> f) : fn(std::move(f)) {}
    void dismiss() { active = false; }
    ~ScopeGuard() { if (active) fn(); }
};

int main() {
    ScopeGuard g([] { std::cout << "rollback\n"; });
    g.dismiss();   // success: no rollback
}

Für Rollbacks verwenden

Scope Guards eignen sich besonders für transaktionalen Code: Registrieren Sie eine Rollback-Aktion, führen Sie die Arbeit aus und deaktivieren Sie den Guard bei Erfolg.

Guards sind nur verschiebbar

Ein Guard sollte nicht kopiert werden – durch das Kopieren würde die Aktion zweimal ausgeführt. Machen Sie Guards nur verschiebbar oder nicht kopierbar.

Standard- und Bibliothekshelfer

std::scoped_lock schützt mehrere Mutexes, und Bibliotheken wie GSL stellen finally bereit. Viele Codebasen enthalten eine kleine Hilfsfunktion namens ScopeGuard.

Spezialisierte RAII-Typen bevorzugen

Wenn ein dedizierter RAII-Typ vorhanden ist (lock_guard, unique_ptr, fstream), sollten Sie ihn bevorzugen. Verwenden Sie einen generischen Scope Guard nur für spontanes Aufräumen, für das es keinen passenden Wrapper gibt.

Kurze Überprüfung

Testen Sie Ihr Verständnis von Scope Guards.

Zusammenfassung

Sie haben gelernt, dass ein Scope Guard mithilfe von RAII beim Verlassen des Gültigkeitsbereichs automatisch aufräumt. Er behandelt vorzeitige Rückgaben und Ausnahmen, unterstützt mit dismiss() Rollbacks und sollte nur verschiebbar sein. Bevorzugen Sie dedizierte RAII-Typen, wenn solche vorhanden sind.

Häufig gestellte Fragen

Ist die Lektion „Scope Guards“ kostenlos?

Ja — der vollständige Text von „Scope Guards“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Scope Guards“?

Beim Verlassen des Gültigkeitsbereichs aufräumen Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Scope Guards“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Das RAII-Prinzip
  2. Destruktoren und Aufräumen
  3. Rule of Three/Five
  4. Scope Guards
← Zurück zu C++ Academy