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

using namespace std;

struct Test
{
  Test(int d) : data(d) { cerr << "Test::Test"  << endl; }
  ~Test()                { cerr << "Test::~Test" << endl; }

  /* static */ void* operator new(size_t sz);
  /* static */ void  operator delete(void* p) noexcept;
  int data;
};

// member new and delete
void* Test::operator new(size_t sz)
{
  cerr << "Test::new" << endl;
  return ::operator new(sz);
}
void Test::operator delete(void* p) noexcept
{
  cerr << "Test::delete" << endl;
  ::operator delete(p);
}

// global new and delete
void* operator new(size_t sz)
{
  cerr << "::new" << endl;
  return malloc(sz);
}
void operator delete(void* p) noexcept
{
  cerr << "::delete" << endl;
  free(p);
}

int main()
{
    Test *t = new Test(42);
    /* ... */
    delete t;

    return 0;
}
