Mediumисключения

Что такое strong/weak/no-throw exception guarantee?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Уровни гарантий безопасности исключений определяют состояние объекта при выбросе исключения.

// 1. No-throw (noexcept) — не бросает
~Widget() noexcept;            // деструкторы всегда noexcept

// 2. Strong (commit-or-rollback) — откат к исходному состоянию
// vector::push_back даёт strong, если move noexcept
v.push_back(x);  // при исключении v остался прежним

// 3. Basic — объект валиден, не утечка, но состояние может измениться
// 4. No guarantee
  • No-throw — noexcept; обязательно для деструкторов и deallocation;
  • Strong — состояние как до операции (важно для публичных операций);
  • Basic — валидное состояние, нет утечек, но не обязательно прежнее.

STL: если move-конструктор noexcept, vector при reallocation использует move (strong, быстро), иначе copy (strong, дороже).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.