Ответ вслух Junior RAII и умные указатели спрашивают часто обновлено

Объясни RAII на примерах

Вопрос

Объясните, что такое RAII, приведите примеры из стандартной библиотеки и расскажите, почему это важно при исключениях.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

RAII означает, что ресурс принадлежит объекту: захватывается в конструкторе, освобождается в деструкторе. Поскольку деструкторы локальных объектов вызываются автоматически при выходе из области видимости, ресурс освобождается при любом пути выхода: return, break, исключение.

Что должно прозвучать в ответе

  • Ресурс захватывается в конструкторе, освобождается в деструкторе

  • Деструкторы вызываются при любом выходе из области видимости, включая исключения

  • Примеры: контейнеры, fstream, lock_guard и unique_lock, умные указатели, jthread

  • Порядок уничтожения обратный порядку создания

  • Деструкторы не должны бросать исключения

Что могут спросить следом

  • Что будет, если деструктор бросит исключение во время раскрутки стека?
  • Как сделать RAII-обёртку для дескриптора сокета?

Разбор

RAII означает, что ресурс принадлежит объекту: захватывается в конструкторе, освобождается в деструкторе. Поскольку деструкторы локальных объектов вызываются автоматически при выходе из области видимости, ресурс освобождается при любом пути выхода: return, break, исключение. В стандартной библиотеке это везде: std::vector и std::string владеют памятью, std::fstream закрывает файл, std::lock_guard и std::unique_lock отпускают мьютекс, std::unique_ptr удаляет объект, std::jthread присоединяет поток. Объекты уничтожаются в обратном порядке, так что зависимые ресурсы освобождаются раньше тех, от кого зависят. Важно, чтобы деструкторы не бросали исключений: если исключение вылетит из деструктора во время раскрутки стека, вызовется std::terminate, к тому же деструкторы по умолчанию noexcept. Благодаря RAII в C++ не нужен finally, а код с исключениями остаётся без утечек.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.