0Pricing
C++ Academy · Lezione

Guardie di ambito

Eseguire la pulizia all'uscita dall'ambito

Guardie di ambito è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Che cos'è una scope guard?

Una scope guard è un oggetto RAII il cui unico compito è eseguire un'azione di pulizia quando esce dall'ambito, anche in caso di ritorno anticipato o eccezione.

Il problema che risolve

Senza una scope guard, è facile dimenticare la pulizia dopo un return anticipato o un throw. Una scope guard rende l'azione automatica.

lock_guard: una scope guard standard

std::lock_guard blocca un mutex durante la costruzione e lo sblocca alla distruzione: è una scope guard integrata per i lock.

#include <mutex>

std::mutex m;

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

Una scope guard realizzata manualmente

Può scrivere una scope guard che conserva una funzione e la chiama nel distruttore.

#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";
}

La pulizia viene eseguita al ritorno anticipato

Poiché il distruttore viene eseguito all'uscita dall'ambito, l'azione della scope guard viene eseguita indipendentemente dal modo in cui la funzione termina.

#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); }

La pulizia viene eseguita in caso di eccezione

Se lo svolgimento dello stack attraversa l'ambito a causa di un'eccezione, il distruttore della scope guard viene comunque eseguito e rilascia la risorsa in sicurezza.

Annullare una scope guard

A volte è necessario saltare la pulizia, ad esempio quando l'operazione ha avuto successo. Le scope guard reali offrono un metodo dismiss() per disabilitare l'azione.

#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
}

Utilizzarla per il rollback

Le scope guard sono particolarmente utili nel codice transazionale: registri un'azione di rollback, esegua il lavoro, quindi annulli la scope guard in caso di successo.

Le scope guard sono solo spostabili

Una scope guard non dovrebbe essere copiata: la copia eseguirebbe l'azione due volte. Renda le scope guard solo spostabili o non copiabili.

Helper standard e di libreria

std::scoped_lock protegge più mutex, mentre librerie come GSL forniscono finally. Molti codebase includono una piccola utility ScopeGuard.

Preferire tipi RAII specifici

Quando esiste un tipo RAII dedicato (lock_guard, unique_ptr, fstream), lo preferisca. Utilizzi una scope guard generica solo per operazioni di pulizia ad hoc senza un wrapper naturale.

Verifica rapida

Verifichi la comprensione delle scope guard.

Riepilogo

Ha imparato che una scope guard esegue automaticamente la pulizia all'uscita dall'ambito tramite RAII. Gestisce ritorni anticipati ed eccezioni, supporta il rollback con dismiss() e dovrebbe essere solo spostabile. Preferisca i tipi RAII dedicati quando disponibili.

Domande Frequenti

La lezione «Guardie di ambito» è gratuita?

Sì — il testo completo di «Guardie di ambito» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Guardie di ambito»?

Eseguire la pulizia all'uscita dall'ambito Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Guardie di ambito»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il principio RAII
  2. Distruttori e pulizia
  3. Regola del tre/cinque
  4. Guardie di ambito
← Torna a C++ Academy