#include #include #include void* operator new(std::size_t size, char c) throw(std::bad_alloc) { std::cout << "overloaded operator new " << c << std::endl; void* p = malloc(size); if (!p) { throw std::bad_alloc(); } return p; } void operator delete(void* p, char c) throw() { std::cout << "overloaded operator delete " << c << std::endl; free(p); } void operator delete (void *p) throw() { std::cout << "standard operator delete " << std::endl; free(p); } struct Foo { Foo() { std::cout << "Foo::Foo" << std::endl; // hack it to sometimes throw static int counter = 1; if (counter++ == 2) { throw 1; } } ~Foo() { std::cout << "Foo::~Foo" << std::endl; } }; int main(int argc, char** argv) { Foo* fp; for (int i = 0; i < 5; ++i) { std::cout << "===================================================" << std::endl; char c = 'a' + i; try { // call our version of new that takes a char fp = new(c) Foo; } catch(int i) { std::cout << "catch exception from constructor" << std::endl; continue; } // call normal delete expression and operator delete delete fp; std::cout << "===================================================" << std::endl; } return 0; }