Scope Guards em C 11
Uma das principais vantagens das expressões lambda C 11 reside em sua capacidade de expressar o conceito de RAII ( Aquisição de recursos é inicialização) de maneira concisa e elegante. A implementação tradicional do RAII depende de destruidores para liberar recursos, mas com expressões lambda é possível criar um objeto que executará uma função de limpeza ao sair de seu escopo, independente de como essa saída ocorra. Isso é conhecido como proteção de escopo.
Implementação simples de proteção de escopo
Aqui está um exemplo de implementação simples de proteção de escopo em C 11:
templateA classe ScopeGuard usa uma expressão lambda como argumento do construtor, que representa a ação de limpeza a ser executada quando o protetor de escopo sai do escopo. O sinalizador confirmado indica se a ação de limpeza foi executada.
Uso
A classe ScopeGuard pode ser usada para garantir que os recursos sejam liberados corretamente, mesmo se ocorrer uma exceção . Por exemplo, a função a seguir adquire um recurso e garante que ele seja liberado usando um protetor de escopo:
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();
}
Neste exemplo, o ScopeGuard é usado para garantir que os elementos sejam removidos dos vetores mesmo se ocorrer uma exceção.
Conclusão
Os protetores de escopo são uma ferramenta poderosa para garantir que os recursos sejam liberados adequadamente em C 11. A implementação simples apresentada aqui é uma maneira direta de implementar esse padrão. No entanto, existem implementações mais complexas que oferecem recursos adicionais, como a capacidade de transferir propriedade de recursos entre protetores de escopo.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3