extern "C" {
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
}
#include <iostream>

//location new
void* operator new(size_t size,const char* src,int line)
{
  void *p;
  p = malloc(size);
  cout << "location new in " << src << " at line "
       << line << " size " << size << " alloc " 
       << (unsigned int)p << '\n';
  return  p;
}


//location delete
void operator delete(void* p,const char* src,int line)
{
  cout << "location delete in " << src << " at line "
       << line << " alloc " << (unsigned int)p << '\n';
  free(p);
}

//overloaded delete
void operator delete(void* p) 
{
  cout << "overloaded delete alloc " << (unsigned int)p << '\n';
  free(p);
}
       

#define new  new(__FILE__,__LINE__)


class X
{
public:
  int *val;
  char filler[2];
  X() { val=NULL; }
  X(int x) { 
    cout << "CON\n";        //entering constructor
    val = new int;
    *val = x; 
    cout << "EXIT CON\n";   //exiting constructor
  }
  ~X() { 
    cout << "DES\n";        //entering destructor
    delete val; 
    cout << "EXIT DES\n";   //exiting destructor
  }
};//end class X

void doit();

// function main ---------------------------------------------- 
int main() 
{
  doit();
  return 0;
}//end main


// function doit ---------------------------------------------- 
void doit() 
{
  X x(32);
  cout << "address of object x is " << (unsigned int) &x << '\n';

  X *p = new X(33);
  cout << "p = " << (unsigned int) p << '\n';
  delete p;
}//end doit