Listing 12

#include <memory>
#include <stdlib.h>
#include <new>
#include <iostream>
using std::tr1::shared_ptr;
using std::cout; using std::bad_alloc;

struct S
  { // simple struct
  S() { cout << "S object constructed\n"; }
  ~S() { cout << "S object destroyed\n"; }
  };

static bool new_should_fail;
void *operator new(size_t sz)
  { // fails on demand
  if (new_should_fail)
    { // reset, so subsequent calls succeed
    new_should_fail = false;
    throw bad_alloc();
    }
  return malloc(sz);
  }

void operator delete(void *ptr)
  { // complement to operator new
  free(ptr);
  }

int main()
  { // demonstrate exception safety
  S *sptr = new S;
  new_should_fail = true;
  shared_ptr<S> sp;
  try
    { // make sure we can catch exceptions
    sp.reset(sptr);
    }
  catch(const bad_alloc&)
    { // got one!
    cout << "Caught bad_alloc\n";
    }
  return 0;
  }