Определение
Развёртка стека — это процесс, который происходит при обработке исключений в C++. Когда выбрасывается исключение, программа автоматически вызывает деструкторы всех локальных объектов между точкой, где возникло исключение, и местом, где оно перехватывается.
Как это работает
- Исключение выбрасывается в определённом месте кода
- Программа ищет подходящий блок
catch, двигаясь вверх по стеку вызовов
- При выходе из каждой области видимости функции вызываются деструкторы всех локальных объектов в этой области
- Это продолжается до тех пор, пока не найдётся подходящий обработчик исключения
Ключевые характеристики
- Автоматический процесс: развёртка стека происходит автоматически; тебе не нужно вручную вызывать деструкторы
- Порядок LIFO: деструкторы вызываются в порядке, обратном созданию объектов (Last In, First Out)
- Освобождение ресурсов: это гарантирует корректную очистку ресурсов — памяти, файловых дескрипторов, соединений с базой данных
Практический пример
void functionA() {
MyObject obj1;
try {
functionB(); // Исключение выбрасывается здесь
}
catch (std::exception& e) {
// Развёртка стека останавливается здесь
// Деструктор obj1 уже был вызван
}
}
Важные замечания
- Развёртка стека необходима для паттерна RAII (Resource Acquisition Is Initialization)
- Деструкторы не должны выбрасывать исключения во время развёртки, так как это приводит к аварийному завершению программы
- Затрагиваются только локальные объекты; объекты, выделенные динамически в куче, нужно освобождать отдельно
- Этот механизм предотвращает утечки ресурсов и обеспечивает предсказуемое поведение при очистке