Scope guard
Назначение
Идиома Scope-guard (область-хранитель) является подходом в программировании, который используется для автоматического освобождения ресурсов и выполнения определенных действий при выходе из области видимости (scope) в программе. Используется при:
Работе с ресурсами, которые должны быть освобождены в случае исключения.
Реализации обратных вызовов (например, при регистрации обработчика событий в библиотеке или фреймворке, Scope Guard может быть использован для отмены регистрации обработчика, когда он больше не нужен.).
Работе с транзакциями (например, при работе с базами данных, транзакции могут быть начаты в конструкторе объекта и завершены в деструкторе. Scope Guard может быть использован для отката транзакции, если произошло исключение, но не для освобождения ресурсов, связанных с транзакцией.)
Решаемые задачи
Сохранение ресурсов при выходе из области видимости, если исключение не проброшено
Идиома RAII позволяет получать ресурсы в конструкторе и высвобождать их в деструкторе, когда область заканчивается успешно или из-за исключения. Однако, иногда необходимо не высвобождать ресурсы, если исключение не выбрасывается. Идиома Scope-guard решить эту задачу и улучшить типичную реализацию идиомы RAII с помощью условной проверки.
Общая реализация на языке C++
class ScopeGuard {
public:
ScopeGuard () : engaged_(true)
{
/* Выделение ресурсов */
}
~ScopeGuard() {
if (engaged_)
{
/* Освобождение ресурсов */
}
}
void release()
{
engaged_ = false;
/* Ресурсы больше не будут освобождаться */
}
private:
bool engaged_;
};
void some_init_function()
{
ScopeGuard guard;
// если выброситься какая-то ошибка, ресурсы будут освобождены.
guard.release(); // Ресурсы не будут освобождены при обычном выполнении.
}
Last updated
Was this helpful?