C++ Academy · Lección

Guardas de ámbito

Ejecute la limpieza al salir del ámbito

Lección 4 de 413 pasos

Guardas de ámbito es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué es una guardia de ámbito?

Una guardia de ámbito es un objeto RAII cuya única función es ejecutar una acción de limpieza cuando sale de ámbito, incluso al retornar antes de tiempo o producirse una excepción.

El problema que resuelve

Sin una guardia, es fácil olvidar la limpieza después de un return anticipado o un throw. Una guardia de ámbito convierte la acción en automática.

lock_guard: una guardia de ámbito estándar

std::lock_guard bloquea un mutex al construirse y lo desbloquea al destruirse: es una guardia de ámbito integrada para bloqueos.

#include <mutex>

std::mutex m;

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

Una guardia implementada manualmente

Puede escribir una guardia que almacene una función y la invoque en el destructor.

#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 limpieza se ejecuta al retornar antes de tiempo

Como el destructor se activa al salir del ámbito, la acción de la guardia se ejecuta independientemente de cómo finalice la función.

#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 limpieza se ejecuta al producirse una excepción

Si una excepción desenrolla la pila a través del ámbito, el destructor de la guardia sigue ejecutándose y libera el recurso de forma segura.

Cancelar una guardia

A veces querrá omitir la limpieza porque la operación se realizó correctamente. Las guardias reales ofrecen un método dismiss() para desactivar la acción.

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

Usar para deshacer cambios

Las guardias de ámbito son especialmente útiles en código transaccional: registre una acción de reversión, realice el trabajo y desactive la guardia cuando todo haya terminado correctamente.

Las guardias son de solo movimiento

Una guardia no debería copiarse, ya que la copia ejecutaría la acción dos veces. Haga que las guardias sean de solo movimiento o no copiables.

Ayudantes estándar y de bibliotecas

std::scoped_lock protege varios mutexes, y bibliotecas como GSL proporcionan finally. Muchas bases de código incluyen una pequeña utilidad ScopeGuard.

Preferir tipos RAII específicos

Cuando exista un tipo RAII específico (lock_guard, unique_ptr, fstream), prefiera utilizarlo. Use una guardia de ámbito genérica solo para limpiezas puntuales que no tengan un envoltorio natural.

Comprobación rápida

Compruebe su comprensión de las guardias de ámbito.

Resumen

Ha aprendido que una guardia de ámbito ejecuta la limpieza automáticamente al salir del ámbito mediante RAII. Gestiona retornos anticipados y excepciones, permite deshacer cambios mediante dismiss() y debería ser de solo movimiento. Prefiera tipos RAII específicos cuando existan.

Gratis para empezar

Aprende C++ con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Guardas de ámbito» es gratis?

Sí — el texto completo de «Guardas de ámbito» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Guardas de ámbito»?

Ejecute la limpieza al salir del ámbito Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Guardas de ámbito»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. El principio RAII
  2. Destructores y limpieza
  3. Regla de tres/cinco
  4. Guardas de ámbito
← Volver a C++ Academy