Во время стека C ++ раскручивается во время исключения, где хранится локальное значение исключения - PullRequest
0 голосов
/ 15 апреля 2019

Я знаком с ментальной моделью исключения C ++ и с тем, как он может управляться программно. Например, все в этом ответе: SO Вопрос по теме

Что меня удивляет, так это то, как сохраняется объект исключения (что перехватчик может перехватить), если это значение создается в кадре бросающего стека, а текущие и произвольные числа предшествующих кадров размотано, все владельцы-хозяева уничтожены (если написано с RAII). Чтобы сделать вещи менее дешифруемыми, рекомендуется использовать шаблон value и const & ... значение, стек которого пропал? ... ссылка на потенциально неназванный значение давно разрушенного кадра? Я явно что-то упускаю. Ссылки на exited-local-function-objects являются классической ошибкой новичка, но в этом случае это рекомендуется. Я предполагаю, что шаблон броска перехвата, смешанный с пользовательским кодом, является иллюзией, с реализацией, которая совершенно отличается, но заставляет меня задуматься, где хранится объект исключения (неявно не выделенный в куче), так что он может быть перехвачен во время выполнения - переменное местоположение, учитывая тот факт, что кадр стека, в котором, казалось бы, хранится его значение, предназначен для немедленной размотки?

Редактировать : Некоторые вопросы касательно, вдохновленные ответом подробности реализации @ RichardCritten: Что, если объект исключения создается как l-значение, а не выбрасывается? Что, если такое l-значение параметризовано и аргументировано, а затем выброшено другой функцией (гарантированно ли она все еще знает контекст выброса)? Что, если объект выделен с новым, и его ссылка используется для броска? Вы вынуждены «просто использовать исключения в соответствии с рекомендациями и полагать, что они будут вести себя как стандартные мандаты»?

...