Hello there, >From what I understand, if one uses placement new with a parameter to >initialize a class, and if that class' constructor throws an exception, then a >matching delete operator is called to release the memory.
This does not seem to work if the overloaded delete operator is a template function. I wrote a test program as follows: == code == #include <stdio.h> #include <stdlib.h> class MyClass { public: MyClass() { throw 1; } // constructor throws exception }; class Pool1 { public: void *Alloc(size_t size) { printf("Pool1::Alloc()\n"); return malloc(size); } void Free(void *p) { printf("Pool1::Free()\n"); return free(p); } }; template<typename T> class Pool2 { public: void *Alloc(size_t size) { printf("Pool2::Alloc()\n"); return malloc(size); } void Free(void *p) { printf("Pool2::Free()\n"); return free(p); } }; inline void *operator new(size_t size,Pool1& pool) { return pool.Alloc(size); } inline void operator delete(void *p,Pool1& pool) { return pool.Free(p); } template<typename T> inline void *operator new(size_t size,Pool2<T>& pool) { return pool.Alloc(size); } template<typename T> inline void operator delete(void *p,Pool2<T>& pool) { return pool.Free(p); } int main (int argc, char * const argv[]) { Pool1 pool1; Pool2<int> pool2; try { MyClass *myclass = new (pool1) MyClass(); // OK! } catch(...) { } try { MyClass *myclass = new (pool2) MyClass(); // delete not called! } catch(...) { } return 0; } == end code == The output I get is: Pool1::Alloc() Pool1::Free() Pool2::Alloc() on gcc 4.2.4 (Ubuntu Hardy Heron) and gcc 4.0.1 Mac OS X. The expected output is: Pool1::Alloc() Pool1::Free() Pool2::Alloc() Pool2::Free() as produced with Visual Studio. Is the usage of the delete operator as a template function incorrect or is this a bug? Thanks for the help!