Не удалось найти информацию, где создаются экземпляры класса исключений во время обработки исключений? В какой области памяти (стек, куча, статическое хранилище и т. Д.)? Я предполагаю, что это не в стеке из-за разматывания стека ...
Из стандарта:
15.2.4: память для временной копии создаваемого исключения: распределяется неопределенным образом, за исключением случаев, указанных в 3.7.3.1.
И 3.7.3.1 говорит:
3.7.3.1: Все объекты, которые не имеют динамического длительность хранения, ни местные статическая продолжительность хранения. Хранение для этих объектов будет продолжаться для продолжительность программы (3.6.2, 3.6.3).
Ответ "в загадочной области, управляемой компилятором" - серьезно, стандарт не указывает, где они должны храниться.
Кухня указана по стандарту, она не уточняется. Большинство реализаций выделяет их из кучи, так как они должны пережить процесс разматывания стека, который может удалять кадры стека (при выбросе вне функции) или создавать новые (вызывая деструкторы и т. Д.). GCC использует встроенную функцию __cxa_allocate_exception для выделения памяти.
__cxa_allocate_exception
Исключения всегда генерируются по значению, поэтому нет проблем, даже если они размещены в стеке