Relajación de pila en C++

Stack Unwinding es el proceso de eliminar entradas de función de la pila de llamadas de función en tiempo de ejecución. Los objetos locales se destruyen en el orden inverso al que fueron construidos. 

Stack Unwinding generalmente está relacionado con el manejo de excepciones . En C++, cuando se produce una excepción, se busca linealmente en la pila de llamadas de funciones el controlador de excepciones, y todas las entradas antes de la función con el controlador de excepciones se eliminan de la pila de llamadas de funciones. Por lo tanto, el manejo de excepciones implica el Desbobinado de pila si una excepción no se maneja en la misma función (donde se lanza). Básicamente, el desenrollado de pilas es un proceso de llamar a los destructores (siempre que se lanza una excepción) para todos los objetos automáticos construidos en tiempo de ejecución. 

Por ejemplo, la salida del siguiente programa es: 

CPP

// CPP Program to demonstrate Stack Unwinding
#include <iostream>
using namespace std;
  
// A sample function f1() that throws an int exception
void f1() throw(int)
{
    cout << "\n f1() Start ";
    throw 100;
    cout << "\n f1() End ";
}
  
// Another sample function f2() that calls f1()
void f2() throw(int)
{
    cout << "\n f2() Start ";
    f1();
    cout << "\n f2() End ";
}
  
// Another sample function f3() that calls f2() and handles
// exception thrown by f1()
void f3()
{
    cout << "\n f3() Start ";
    try {
        f2();
    }
    catch (int i) {
        cout << "\n Caught Exception: " << i;
    }
    cout << "\n f3() End";
}
  
// Driver Code
int main()
{
    f3();
  
    getchar();
    return 0;
}
Producción

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

Explicación:

  • Cuando f1() arroja una excepción, su entrada se elimina de la pila de llamadas de función, porque f1() no contiene un controlador de excepciones para la excepción lanzada, luego se busca un controlador de excepciones en la siguiente entrada en la pila de llamadas.
  • La siguiente entrada es f2(). Dado que f2() tampoco tiene un controlador, su entrada también se elimina de la pila de llamadas de funciones.
  • La siguiente entrada en la pila de llamadas de funciones es f3(). Dado que f3() contiene un controlador de excepciones, se ejecuta el bloque catch dentro de f3() y, finalmente, se ejecuta el código después del bloque catch.

 Tenga en cuenta que las siguientes líneas dentro de f1() y f2() no se ejecutan en absoluto. 

 cout<<"\n f1() End ";  // inside f1()

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

Si hubiera algunos objetos de clase local dentro de f1() y f2(), los destructores de esos objetos locales se habrían llamado en el proceso de desenredado de pila.

Nota: Stack Unwinding también ocurre en Java cuando la excepción no se maneja en la misma función. 

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *