Я не мог найти информацию, где экземпляры класса исключений создаются во время обработки исключений? В которой области памяти (стек, "куча", статическое устройство хранения данных, и т.д.)? Я предполагаю, что это не находится на стеке из-за раскручивания стека...
Из стандарта:
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
для выделения памяти.