В какой области памяти создаются экземпляры классов исключений? - PullRequest
7 голосов
/ 12 февраля 2010

Не удалось найти информацию, где создаются экземпляры класса исключений во время обработки исключений? В какой области памяти (стек, куча, статическое хранилище и т. Д.)? Я предполагаю, что это не в стеке из-за разматывания стека ...

Ответы [ 4 ]

5 голосов
/ 12 февраля 2010

Из стандарта:

15.2.4: память для временной копии создаваемого исключения: распределяется неопределенным образом, за исключением случаев, указанных в 3.7.3.1.

И 3.7.3.1 говорит:

3.7.3.1: Все объекты, которые не имеют динамического длительность хранения, ни местные статическая продолжительность хранения. Хранение для этих объектов будет продолжаться для продолжительность программы (3.6.2, 3.6.3).

3 голосов
/ 12 февраля 2010

Ответ "в загадочной области, управляемой компилятором" - серьезно, стандарт не указывает, где они должны храниться.

1 голос
/ 12 февраля 2010

Кухня указана по стандарту, она не уточняется. Большинство реализаций выделяет их из кучи, так как они должны пережить процесс разматывания стека, который может удалять кадры стека (при выбросе вне функции) или создавать новые (вызывая деструкторы и т. Д.). GCC использует встроенную функцию __cxa_allocate_exception для выделения памяти.

0 голосов
/ 12 февраля 2010

Исключения всегда генерируются по значению, поэтому нет проблем, даже если они размещены в стеке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...