1 // { dg-do run } 2 // Test that a throw in B's constructor destroys the A and frees 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 newed = 0; // The libraries might call new before int main starts. 24 try { 25 foo (new B (A ())); 26 } catch (...) { } 27 28 return !(!newed && !created); 29 } 30 31 A::A() { created = 1; } 32 A::~A() { created = 0; } 33 B::B(A) { throw 1; } 34 void foo (B*) { } 35 36 void* operator new (size_t size) throw (std::bad_alloc) 37 { 38 ++newed; 39 return (void *) std::malloc (size); 40 } 41 42 void operator delete (void *p) throw () 43 { 44 --newed; 45 free (p); 46 } 47 48