This question provides more clarity on the problem described here. I did some more investigation and found that the stack unwinding is not happening in the following piece of code:
class One { public: int x ; }; class Wrapper { public: Wrapper(CString csText):mcsText(csText) { CString csTempText; csTempText.Format('Wrapper constructor :: %s\n', mcsText); OutputDebugString(csTempText); } ~Wrapper() { CString csTempText; csTempText.Format('Wrapper destructor :: %s\n', mcsText); OutputDebugString(csTempText); } CString mcsText; }; class Test { public: void notifyError() { try { int x = 10; } catch(...) {} } void OnRecvBuffer() { try { Wrapper a('AddRef'); One* p = NULL; p->x = 10; } catch(...) { notifyError(); } } }; int main() { Test* pTest = new Test; pTest->OnRecvBuffer(); OutputDebugString('Test'); }
I compiled this code using VC6 SP5 compiler and the output is ‘Wrapper constructor :: AddRef!!!’ (i.e. the destructor of wrapper object which was constructed on stack is not called. Is this the expected behavior ? or is it a bug with VC compiler ? Can I use some compiler flags so that the stack unwinding happens in this case?
If you want to use SEH, you must use _set_se_translator function and /EHa compiler option.