Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab-07.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
132 Кб
Скачать
☆

Розгортання стека

Припустимо, що блок try не містить прямого виклику функції, що генерує виключення, але викликає функцію, що у свою чергу викликає функцію, що генерує виключення. Виконання програми передається від функції, у якій генерується виключення, функції, що містить блок try та відповідні оброблювачі виключень catch. Для цього виконується процедура розгортанням стека.

В мові C++ виклики та повернення функцій обробляються наступним чином. При виклику функції інформація розміщається в стеку. Зокрема, у стеку програма розміщає адресу інструкції, що викликала функцію (адресу повернення). При завершенні виконання функції, що була викликана, програма використовує зазначену адресу як адресу, з якого продовжується виконання програми. При виклику функції всі її аргументи також записуються в стек, де вони одержують статус змінних з автоматичним класом пам’яті. Якщо у функції, що викликається, створюються нові змінні з автоматичним класом пам’яті, вони, у свою чергу, також додаються в стек. Якщо у даній функції викликається інша функція, то її інформація також додається в стек і т.д. Коли завершується виконання функції, керування передається за адресою, що була збережена при виклику функції, при цьому вершина стека звільняється. Таким чином, після виконання функції відбувається повернення до тієї функції, що її викликала, і т.д., причому при завершенні роботи кожної з таких функцій відбувається звільнення змінних з автоматичним класом пам’яті. Якщо змінні з автоматичним класом пам’яті є об’єктами класу, то викликається деструктор класу (якщо такий є).

Більш докладно робота з класами та об’єктами розглядається у курсі Об’єктно-орієнтоване програмування.

Тепер припустимо, що виконання функції переривається не в результаті повернення керування функції, що її викликала, а в результаті виконання блоку обробки виключення. Тоді програма так само, як у випадку нормального повернення, видаляє значення зі стека. Але замість того, щоб зупинитися на першій адресі повернення в стеку, програма буде продовжувати звільняти стек, поки не досягне адреси повернення, що перебуває у відповідному блоці try. Після цього керування передається оброблювачам виключень наприкінці цього блоку, а не першому операторові, розташованому зразу за оператором виклику функції. Цей процес називається розгортанням стека. Однією з важливих особливостей механізму генерації виключень є те, що як і при поверненні функцій викликаються деструктори класів для будь-яких автоматичних об’єктів, розташованих в стеку. При цьому при поверненні керування з функції обробляються лише об’єкти, розміщені в стеку цією функцією, у той час як механізм обробки виключень обробляє об’єкти, що були розміщені в стеку при виконанні цілого ланцюга викликів функцій між блоком try та місцем генерації виключень. При відсутності властивості розгортання стека при генерації виключень залишилися б невикликаними деструктори для автоматичних об’єктів класів, розміщених у стеку при реалізації проміжних викликів всіх відповідних функцій.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]