Listing 4: Illustrates objects left undestroyed by longjmp

// destroy1.cpp
#include <iostream>
#include <setjmp.h>
using namespace std;

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

jmp_buf env;

main()
{
    void f();
    if (setjmp(env) == 0)
        f();
    else
        cout << "Returned via longjmp" << endl;
    return 0;
}

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

void g()
{
    Foo x;
    longjmp(env,1);
}

// Output:
Foo constructor
Foo constructor
Returned via longjmp
//End of File