Как работает раскрутка стека в C++?

Рейтинг: 4Ответов: 1Опубликовано: 02.04.2023

Никак не могу понять последний этап раскрутки стека.

Допустим, есть функции А, B, C. Вызываются они также: A->B->C.
В функции C выбрасывается исключение, запускается некая функция рантайма по поиску обработчика сначала во фрейме функции С, если не находит обработчик исключения, содержимое фрейма С затирается, потом ищет в B и стирает его фрейм в стеке, а обработчик находится в функции A, обработчику которой нужно передать управление.

Как затирает свой фрейм функция рантайма, которая раскручивает стек после того, как найдет нужный обработчик?

Ответы

▲ 3

Каждый компилятор делает это по своему. Например g++ создаёт отдельный код, который вызывает просто деструктор всех переменных в данной функции. И это продолжится пока не натыкается на обработку catch. Если стек вызовов закончился данный процесс просто заканчивает свою работу.
Например код

string fun(string & a,string & b){
  return a + b ;
}

имеет скрытый обработчик исключения такой :

void _Unwind_fun(void){
  b . ~ string () ;
  a . ~ string () ;
  _Unwind_Resume ( ) ;
}

_Unwind_Resume ничего не возвращает и раскручивает стек дальше.

Никто ничего не затирает, вызываются деструкторы и просто стек вызовов опускается для обработки кода дальше.