The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

13.5 Упражнения

13.5 Упражнения

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

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

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

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

 

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