2008/10/28 S. Tang <[EMAIL PROTECTED]>:
> 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 think you've found a bug. Here is a reduced test which should fail
to compile, but gcc accepts it:
#include <stddef.h>
template <class T> class undef;
struct MyClass
{
MyClass() { throw 1; } // constructor throws exception
};
template<typename T> class Pool2 { };
template<typename T>
inline void *operator new(size_t size,Pool2<T>& pool)
{
return new char[size];
}
template<typename T>
inline void operator delete(void *p,Pool2<T>& pool)
{
undef<T> t; // ERROR
delete[] (char*)p;
}
int main (int argc, char * const argv[]) {
Pool2<int> pool2;
try {
MyClass *myclass = new (pool2) MyClass(); // delete not called!
} catch(...) { }
return 0;
}