Listing 5: Illustrates stack unwinding

// destroy2.cpp
#include <iostream>
using namespace std;

class Foo
{
public:
    Foo() {cout << "Foo constructor" << endl;}
    ~Foo() {cout << "Foo destructor" << endl;}
};

main()
{
    void f();
    try       // Turn on exception handling
    {
        f();
    }
    catch(int)
    {
        cout << "Caught exception" << endl;
    }
    return 0;
}

void f()
{
    void g();
    Foo x;
    g();
}

void g()
{
    Foo x;
    throw 1;
}

// Output:
Foo constructor
Foo constructor
Foo destructor
Foo destructor
Caught exception
//End of File