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 подскажет развёрнутый ответ в реальном времени.