try
{
    range_error r("Hi I am hereeeee!");
    cout << r.what() << endl;   // print "Hi I am hereeeee!"  // case one
    exception *p2 = &r; 
    cout << p2->what() << endl; // print "Hi I am hereeeee!"  // case two
    throw p2;
}
catch (exception *e)
{
    cout << e->what() << endl;  // print "Unknown exception"  // case three
}
Question>
I don't know why case three prints "Unknown exception" instead of "Hi I am hereeeee!"? The printed result is copied from VS2010
This program results in undefined behavior.  Because the variable r is declared inside the try block, it goes out of scope before the catch handler is invoked.  At this point, e points to some area on the stack where an object of type range_error used to exist.
The following program should print the expected results:
range_error r("Hi I am hereeeee!");
try
{
    cout << r.what() << endl;   // print "Hi I am hereeeee!"  // case one
    exception *p2 = &r; 
    cout << p2->what() << endl; // print "Hi I am hereeeee!"  // case two
    throw p2;
}
catch (exception *e)
{
    cout << e->what() << endl;  // print "Hi I am hereeeee!"  // case three
}
However, you should not throw a pointer to an object, you should throw the object itself.  The run-time library will store a copy of the range_error object and pass that copy to the exception handler.
Thus, you should use the following code instead:
try
{
    range_error r("Hi I am hereeeee!");
    cout << r.what() << endl;   // print "Hi I am hereeeee!"  // case one
    throw r;
}
catch (const exception& e)
{
    cout << e.what() << endl;  // print "Hi I am hereeeee!"  // case two
}
                        Because by the time you get to the catch, your range_error has been destroyed and you're catching a dangling pointer. Either move the range_error declaration outside the try block or, better yet, throw an instance and catch by reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With