Объясни RAII на примерах
Вопрос
Объясните, что такое RAII, приведите примеры из стандартной библиотеки и расскажите, почему это важно при исключениях.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Ресурс захватывается в конструкторе, освобождается в деструкторе
Деструкторы вызываются при любом выходе из области видимости, включая исключения
Примеры: контейнеры, 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 ошибок.
Ещё по теме «RAII и умные указатели»
- Модель shared_ptr: кто и когда уничтожится
- Дерево на unique_ptr: перенос и удаление поддеревьев
- Управляющий блок shared_ptr
- Пользовательский удалитель
- Цикл из shared_ptr
- Что происходит, когда умирает последний shared_ptr
- Что выведет: порядок конструкторов и деструкторов
- Что выведет: use_count и weak_ptr