#include <iostream>
#include <string>
#include <new>
#include <cstdlib>

//#include <stdlib.h>

void *operator new(size_t s) throw (std::bad_alloc) { void *p = malloc(s); std::cout << "::new:" << p << std::endl; return p; }
void operator delete (void *p) throw () { std::cout << "::delete:" << p << std::endl; free(p); }

struct base {
  base() { }
  virtual ~base() { }
  void *operator new(size_t s) throw (std::bad_alloc) { void *p = malloc(s); std::cout << "base::new:" << p << std::endl; return p; }
  void operator delete (void *p) throw () { std::cout << "base::delete:" << p << std::endl; free(p); }
};

struct derived : base {
  std::string s;
  derived(){ }
  ~derived(){ }
  void *operator new(size_t s) throw (std::bad_alloc) { void *p = malloc(s); std::cout << "derived::new:" << p << std::endl; return p; }
  void operator delete (void *p) throw () { std::cout << "delete::delete:" << p << std::endl; free(p); }
};

int main()
{
  derived* pD= new derived;
  pD->s = "xyz";
  base* pB = pD;
  delete pB;
  return 0;
}
/* end */
