13.5 Упражнения

Предыдущая  Содержание  Следующая V*D*V

Кажется вероятным, что можно было бы легко забыть удалить некоторые вложенные исключения. Поэтому Exception_dtor() мог бы неявно выталкивать исключения из стека, пока не найдёт self. Действительно ли хорошей идеей является их удаление с помощью delete(), чтобы избежать утечек памяти? Что должно произойти, если self не может быть найден?

Точно так же catch() могла бы искать в стеке самое близкое снаряжённое исключение. Должно ли она выталкивать неснаряжённые?

setjmp() является опасной функцией, потому что она не защищена от попытки вернуться в функцию, которая самостоятельно завершилась. Обычно ANSI-C использует стек записей активаций, чтобы выделить память локальным переменным для каждого активного вызова функции. Очевидно, что cause() должна вызываться на более высоком уровне на том стеке, в котором функция, это пробует к longjmp(). Если catchException() передаст адрес локальной переменной вызывающему, мы могли бы сохранить его с помощью jmp_buf и использовать в качестве грубой проверки законности longjmp(). Более необычным способом было бы сохранение магического числа в локальной переменной и выполнение проверки, что оно всё ещё там. В качестве непереносимого решения, мы могли бы быть в состоянии проследовать по цепочке вдоль стека записей активаций и проверять из cause(), всё ли ещё там стековый фрейм вызвавшего catchException().

 

Предыдущая  Содержание  Следующая