Рубрики

Разматывание стека в C ++

Процесс удаления записей функций из стека вызовов функций во время выполнения называется размоткой стека . Разматывание стека обычно связано с обработкой исключений. В C ++, когда возникает исключение, в стеке вызовов функций выполняется линейный поиск обработчика исключений, и все записи перед функцией с обработчиком исключений удаляются из стека вызовов функций. Таким образом, обработка исключений включает в себя разматывание стека, если исключение не обрабатывается в одной и той же функции (где оно генерируется).

Например, вывод следующей программы:

 f3() Start
 f2() Start
 f1() Start
 Caught Exception: 100
 f3() End

#include <iostream>

   

using namespace std;

  
// Пример функции f1 (), которая выдает исключение int

void f1() throw (int) {

  cout<<"\n f1() Start ";

  throw 100;

  cout<<"\n f1() End "

}

  
// Другая примерная функция f2 (), которая вызывает f1 ()

void f2() throw (int) {

  cout<<"\n f2() Start ";

  f1();

  cout<<"\n f2() End ";

}

   
// Другая примерная функция f3 (), которая вызывает f2 () и обрабатывает исключение, выданное функцией f1 ()

void f3() {

  cout<<"\n f3() Start ";

  try {

    f2();

  }

  catch(int i) {

   cout<<"\n Caught Exception: "<<i;

  }

  cout<<"\n f3() End";

}

  
// Функция драйвера для демонстрации процесса разматывания стека

int main() {

  f3();

   

  getchar();

  return 0;

В приведенной выше программе, когда f1 () генерирует исключение, его запись удаляется из стека вызовов функции (поскольку она не содержит обработчик исключений для сгенерированного исключения), тогда следующая запись в стеке вызовов ищется для обработчика исключений. , Следующая запись — это f2 (). Поскольку функция f2 () также не имеет обработчика, ее запись также удаляется из стека вызовов функций. Следующая запись в стеке вызовов функций — это f3 (). Поскольку f3 () содержит обработчик исключений, выполняется блок catch внутри f3 () и, наконец, выполняется код после блока catch. Обратите внимание, что следующие строки внутри f1 () и f2 () не выполняются вообще.

// внутри f1 ()

  cout<<"\n f1() End "

  
// внутри f2 ()

  cout<<"\n f2() End "

Напомним, что если бы внутри f1 () и f2 () было несколько локальных объектов класса, деструкторы для этих локальных объектов были бы вызваны в процессе разматывания стека.

Разматывание стека также происходит в Java, когда исключение не обрабатывается в той же функции.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Разматывание стека в C ++

0.00 (0%) 0 votes