Где программа выделяет память для метания объекта? - PullRequest
3 голосов
/ 06 марта 2020

Если я брошу какую-нибудь строку из функции h ()

f()->g()->h()

таким образом

throw std::string("error");

и поймать только в f (). Где программа выделяет память для этой строки? Очевидно, он не может разместить его в стеке h (). Если это стек f (), каким образом он знает, в каком месте он должен располагаться?

1 Ответ

2 голосов
/ 06 марта 2020

Если это стек f(), каким образом он знает, в каком месте он должен выделяться?

Это временный объект, назначенный неопределенным образом.

Из Броска исключения раздела стандарта:

3 A throw-expression инициализирует временный объект, называемый объект исключения , тип которого определяется путем удаления любых cv-квалификаторов верхнего уровня из типа операнда броска и корректировки типа stati c тип от «массив из T» или «функция, возвращающая T» до «указатель на T» или «указатель на функцию, возвращающую T», соответственно. ...

и

4 Память для объекта исключения выделяется неопределенным образом, за исключением случаев, отмеченных в [ basi c .st c .dynami c .allocation ]. ...

...