Guardas de ámbito
Ejecute la limpieza al salir del ámbito
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 automaticallyUna 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.
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
- El principio RAII
- Destructores y limpieza
- Regla de tres/cinco
- Guardas de ámbito