Title: | C++ |
Notice: | Read 1.* and use keywords (e.g. SHOW KEY/FULL KIT_CXX_VAX_VMS) |
Moderator: | DECCXX::AMARTIN |
Created: | Fri Nov 06 1987 |
Last Modified: | Thu Jun 05 1997 |
Last Successful Update: | Fri Jun 06 1997 |
Number of topics: | 3604 |
Total number of notes: | 18242 |
I can't see anything in then notesfile on this specific issue, and so far as I can see the customer appears to have a point. Or is there something in the ARM that forbids what he's trying to do? (I reproduced this with C++ 5.5-004) Thanks for any comments nick //////////////////////////////////////////////////////////////////////////////// I'm compiling some C++ code on Digital UNIX 4.0 and am getting a problem with exceptions in distructors. The problem is that when the destructor is called and throws an exception, all the local objects are destructed twice, causing the heap to become corrupted. If you run this test program..... --------------------------------------------------------- #include <iostream.h> class EnvExcRaiser { public: EnvExcRaiser () { cout << "Default CTR EnvExcRaiser " << endl; } ~EnvExcRaiser () { cout << "Default DTR EnvExcRaiser " << endl; throw 0; } }; class account { public: account () { cout << "Default CTR account " << (void*)this << endl; } ~account () { cout << "Default DTR account " << (void*)this << endl; } }; int fun() { EnvExcRaiser ex; account accountPtr; return 0; } int main() { try { fun(); } catch (...) { cout << "Exception raised" << endl; } return 0; } --------------------------------------------------------- ...... it gives the following output. Default CTR EnvExcRaiser Default CTR account 0x11ffff7d0 Default DTR account 0x11ffff7d0 Default DTR EnvExcRaiser Default DTR account 0x11ffff7d0 Default DTR EnvExcRaiser IOT/Abort trap (core dumped) Is there a fix available for this? uname -a OSF1 behemoth V4.0 464 alpha
T.R | Title | User | Personal Name | Date | Lines |
---|---|---|---|---|---|
3444.1 | not being ignored | HNDYMN::MCCARTHY | A Quinn Martin Production | Thu Feb 13 1997 11:25 | 3 |
We are looking into this. bjm | |||||
3444.2 | Need assignment to __current_try_block_decl before each dtor | WIDTH::MDAVIS | Mark Davis - compiler maniac | Fri Feb 14 1997 13:37 | 17 |
Looks like we're not updating __current_try_block_decl immediately BEFORE each destructor is called int fun() { __current_try_block_decl =0; EnvExcRaiser ex; __current_try_block_decl =1; account accountPtr; __current_try_block_decl =2; // missing __current_try_block_decl =1; implicit accountPtr.~account(); // missing __current_try_block_decl =0; implicit ex.~EnvExcRaiser(); return 0; | |||||
3444.3 | DECCXX::COLEEN | Tue May 27 1997 15:18 | 23 | ||
This was a bug in the compiler and has been fixed for the V6.0 release of DEC C++. As properly diagnosed in .-1, the cleanup context wasn't updated correctly for a return statement. Since the destructor was called for a return statement that raised the exception, the wrong context was used. This is gross, but the workaround is this: int fun() { { EnvExcRaiser ex; account accountPtr; } return 0; } DEC C++ V5.n was not designed to handle cleanup properly from exceptions thrown in destructors. The design of V6.0 fixes this class of problems. Thanks for reporting this problem. Coleen Phillimore DEC C++ development |