The next code doesn’t call object’s destructor when exception is thrown if compiled with GCC or MS Visual C++:

#include <iostream>
#include <stdexcept>
 
struct A {
    A () { std::cout << "A" << std::endl; }
    ~A () { std::cout << "~A" << std::endl; }
};
 
void myfunc () {
    A temp;
    throw std::runtime_error("moo");
}
 
int main () {
    myfunc();
}
                                                  

This is caused by lack of matching catch() handler –if you add it destructor will be called properly.
Looking at the C++ standard, section 15.3 [except.handle] point 9, we see:
If no matching handler is found in a program, the function terminate()
(_except.terminate_) is called. Whether or not the stack is unwound
before calling terminate() is implementation-defined.
Both gcc and Visual Studio behave the same in this context, and do not perform full stack unwinding in this case.
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s