I recently have been discovered some issue on gcc 4.1.2. Here is my system: OS: Intel-P4,WindowXP+SP2 Cygwin: Setup.exe version 2.573.2.2 config.status: "./configure --enable-languages=c,c++,java,objc" Command line: g++ test.cpp > a 2> b
Minimal example (test.cpp): /////////////////////////////////////////////////////////////////////////////// #include <new> #include <stdio.h> //dummy... template<class T1> class TAlignedMem {}; struct A1 { A1() { throw 0; } }; //throwing in ctor unsigned char* pAlloc1 = 0; //Some user new template<class T> void* operator new(size_t n,TAlignedMem<T>) /*throw()*/ { unsigned char*const pRawMemory = pAlloc1 = reinterpret_cast<unsigned char*>(operator new(n+32)); for(int i = 0; i < 32; i++) { pRawMemory[i] = 0xCC; } printf("user new\n"); return pRawMemory+32; } void DumpBlock(void* p) { if(!p) return; unsigned char*const pRawMemoryWithOffset = reinterpret_cast<unsigned char*>(p); unsigned char*const pRawMemory = pRawMemoryWithOffset-32; for(int i = 0; i < 32/4; i++) { printf("0x%08X ",((unsigned int*)pRawMemory)[i]); } printf("\n"); } //Some user delete template<class T> void operator delete(void* p,TAlignedMem<T>) /*throw()*/ { unsigned char*const pRawMemoryWithOffset = reinterpret_cast<unsigned char*>(p); unsigned char*const pRawMemory = pRawMemoryWithOffset-32; printf("user delete: "); DumpBlock(p); operator delete(pRawMemory); } int main() { A1* p1 = 0; try { p1 = new ((TAlignedMem<A1>())) A1; } catch(...) { printf("catch(...)\n"); } printf("dumped block: "); DumpBlock(pAlloc1); return 0; } /////////////////////////////////////////////////////////////////////////////// a.exe output: /////////////////////////////////////////////////////////////////////////////// user new catch(...) dumped block: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x0000002B /////////////////////////////////////////////////////////////////////////////// If you try correct code from here: /////////////////////////////////////////////////////////////////////////////// //Some user delete template<class T> void operator delete(void* p,TAlignedMem<T>) /*throw()*/ { /////////////////////////////////////////////////////////////////////////////// To this one: /////////////////////////////////////////////////////////////////////////////// //Some user delete void operator delete(void* p,TAlignedMem<A1>) /*throw()*/ { /////////////////////////////////////////////////////////////////////////////// And try run again: /////////////////////////////////////////////////////////////////////////////// user new user delete: 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC 0xCCCCCCCC catch(...) dumped block: 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000000 0x00000061 /////////////////////////////////////////////////////////////////////////////// "delete" will call successfully. -- Summary: Template delete doesn't call if exception thrown in constructor Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: andry at inbox dot ru http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34158