1 // { dg-do run } 2 // Test that a throw in foo destroys the A, but does not free the memory. 3 4 #include <cstddef> 5 #include <cstdlib> 6 #include <new> 7 8 struct A { 9 A(); 10 ~A(); 11 }; 12 13 struct B { 14 B (A); 15 }; 16 17 void foo (B*); 18 19 int newed, created; 20 21 int main () 22 { 23 try { 24 foo (new B (A ())); 25 } catch (...) { } 26 27 return !(newed && !created); 28 } 29 30 A::A() { created = 1; } 31 A::~A() { created = 0; } 32 B::B(A) { } 33 void foo (B*) { throw 1; } 34 35 void* operator new (size_t size) throw (std::bad_alloc) 36 { 37 ++newed; 38 return (void *) std::malloc (size); 39 } 40 41 void operator delete (void *p) throw () 42 { 43 --newed; 44 std::free (p); 45 } 46 47 48 49 50