• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main()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 
A()31 A::A() { created = 1; }
~A()32 A::~A() { created = 0; }
B(A)33 B::B(A) { throw 1; }
foo(B *)34 void foo (B*) { }
35 
operator new(size_t size)36 void* operator new (size_t size) throw (std::bad_alloc)
37 {
38   ++newed;
39   return (void *) std::malloc (size);
40 }
41 
operator delete(void * p)42 void operator delete (void *p) throw ()
43 {
44   --newed;
45   free (p);
46 }
47 
48