[debug_new.h]


#ifndef __DEBUG_NEW_H__
#define __DEBUG_NEW_H__

#include <malloc.h>
#include <stdio.h>

void* operator new(size_t size)
{
  void* res = malloc(size);
  printf("void* operator new(size_t size) %u %p\n", size, res);
  return res;
}

void* operator new(size_t size, const int foo)
{
  void* res = malloc(size);
  printf("void* operator new(size_t size, const int foo) %u %d %p\n", size, foo, res);
  return res;
}

void* operator new(size_t size, const char* bar)
{
  void* res = malloc(size);
  printf("void* operator new(size_t size, const char* bar) %u %s %p\n", size, bar, res);
  return res;
}

void operator delete(void* p)
{
  printf("void  operator delete(void* p) %p\n", p);
  free(p);
}

void operator delete(void *p, const int foo)
{
  printf("void  operator delete(void *p, const int foo) %p %d\n", p, foo);
  free(p);
}

void operator delete(void *p, const char* bar)
{
  printf("void  operator delete(void *p, const char* bar) %p %s\n", p, bar);
  free(p);
}

#endif // __DEBUG_NEW_H__



[new_test.cpp]


#include "debug_new.h"

void test1()
{
  int* p = new int;
  operator delete (p);
}

void test2()
{
  int* p = new (33) int;
  operator delete(p, 44);
}

void test3()
{
  int* p = new ("hello") int;
  operator delete(p, "world");
}

int main()
{
  printf("\ntest1\n"); test1();
  printf("\ntest2\n"); test2();
  printf("\ntest3\n"); test3();
}



[result]


test1
void* operator new(size_t size) 4 00601790
void  operator delete(void* p) 00601790

test2
void* operator new(size_t size, const int foo) 4 33 00601790
void  operator delete(void *p, const int foo) 00601790 44

test3
void* operator new(size_t size, const char* bar) 4 hello 00601790
void  operator delete(void *p, const char* bar) 00601790 world