Alex Rivera | Logout

Why destructor is not called on exception?

Asked 2008-10-21T14:52:16.540
68

I expected A::~A() to be called in this program, but it isn't:

#include <iostream>

struct A {
  ~A() { std::cout << "~A()" << std::endl; }
};

void f() {
  A a;
  throw "spam";
}

int main() { f(); }

However, if I change last line to

int main() try { f(); } catch (...) { throw; }

then A::~A() is called.

I am compiling with "Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86" from Visual Studio 2005. Command line is cl /EHa my.cpp.

Is compiler right as usual? What does standard say on this matter?

Edit
Report

1 Answer

2

In the second example, the dtor is called when it leaves the try{} block.

In the first example, the dtor is called as the program shuts down after leaving the main() function --- by which time cout may already have been destroyed.

answered 2008-10-21T14:58:30.567

Your Answer