// Example 5-25: Overloading new and delete.
#include <cstddef>
#include <iostream>
#include <memory>
#include <new>
#include <ostream>

class demo
{
public:
  static void* operator new(std::size_t size)
  throw (std::bad_alloc)
  {
    std::cout << "demo::new\n";
    if (instance == 0)
      instance = ::new demo;
    ++count;
    return instance;
  }
  static void operator delete(void* p) {
    std::cout << "demo::delete\n";
    if (--count == 0) {
      ::delete instance;
      instance = 0;
    }
  }

  static demo* make() { return new demo(); }

private:
  demo() {}
  demo(const demo&);
  static demo* instance;
  static std::size_t count;
};

demo* demo::instance;
std::size_t demo::count;

int main()
{
  std::auto_ptr<demo> s1(demo::make());
  std::auto_ptr<demo> s2(demo::make());
  return s1.get() == s2.get();
}
