Mediumscope-guard
Что такое идиома ScopeGuard / scope_exit?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
ScopeGuard — RAII-объект, вызывающий заданную функцию в деструкторе (при нормальном выходе и при исключении).
template<class F>
class ScopeGuard {
F f_; bool active_ = true;
public:
explicit ScopeGuard(F f) : f_(std::move(f)) {}
~ScopeGuard() { if (active_) f_(); }
void release() noexcept { active_ = false; } // отмена
};
template<class F> ScopeGuard(F) -> ScopeGuard<F>;
// Использование: cleanup без try/catch
void f() {
auto g = ScopeGuard([&]{ std::fclose(file); });
doWork(); // даже при throw — fclose вызовется
g.release(); // отменить, если всё прошло успешно
}В C++23 добавлены стандартные std::scope_exit, std::scope_fail, std::scope_success.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.