| // { dg-do run } |
| // Test that a throw in foo destroys the A, but does not free the memory. |
| |
| #include <cstddef> |
| #include <cstdlib> |
| #include <new> |
| |
| struct A { |
| A(); |
| ~A(); |
| }; |
| |
| struct B { |
| B (A); |
| }; |
| |
| void foo (B*); |
| |
| int newed, created; |
| |
| int main () |
| { |
| try { |
| foo (new B (A ())); |
| } catch (...) { } |
| |
| return !(newed && !created); |
| } |
| |
| A::A() { created = 1; } |
| A::~A() { created = 0; } |
| B::B(A) { } |
| void foo (B*) { throw 1; } |
| |
| void* operator new (size_t size) throw (std::bad_alloc) |
| { |
| ++newed; |
| return (void *) std::malloc (size); |
| } |
| |
| void operator delete (void *p) throw () |
| { |
| --newed; |
| std::free (p); |
| } |
| |
| |
| |
| |