Scope Guards en C 11
Una de las principales ventajas de las expresiones lambda C 11 radica en su capacidad para expresar el concepto de RAII ( La adquisición de recursos es inicialización) de manera concisa y elegante. La implementación tradicional de RAII se basa en destructores para liberar recursos, pero con expresiones lambda, es posible crear un objeto que ejecutará una función de limpieza al salir de su alcance, independientemente de cómo se produzca esa salida. Esto se conoce como protección de alcance.
Implementación simple de protección de alcance
Aquí hay un ejemplo de una implementación de protección de alcance simple en C 11:
templateLa clase ScopeGuard toma una expresión lambda como argumento de constructor, que representa la acción de limpieza que se ejecutará cuando el protector de alcance sale del alcance. El indicador comprometido indica si se ha ejecutado la acción de limpieza.
Uso
La clase ScopeGuard se puede utilizar para garantizar que los recursos se liberen correctamente, incluso si se produce una excepción. . Por ejemplo, la siguiente función adquiere un recurso y garantiza que se libere mediante un protector de alcance:
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();
}
En este ejemplo, ScopeGuard se utiliza para garantizar que los elementos se eliminen de los vectores incluso si se produce una excepción.
Conclusión
Los protectores de alcance son una herramienta poderosa para garantizar que los recursos se liberen correctamente en C 11. La implementación simple que se presenta aquí es una forma sencilla de implementar este patrón. Sin embargo, existen implementaciones más complejas que ofrecen características adicionales, como la capacidad de transferir la propiedad de recursos entre guardias de alcance.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3