Home | History | Annotate | Download | only in Common
      1 // NewHandler.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include <stdlib.h>
      6 
      7 #include "NewHandler.h"
      8 
      9 // #define DEBUG_MEMORY_LEAK
     10 
     11 #ifndef DEBUG_MEMORY_LEAK
     12 
     13 #ifdef _WIN32
     14 
     15 /*
     16 void * my_new(size_t size)
     17 {
     18   // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
     19   void *p = ::malloc(size);
     20   if (p == 0)
     21     throw CNewException();
     22   return p;
     23 }
     24 
     25 void my_delete(void *p) throw()
     26 {
     27   // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
     28   ::free(p);
     29 }
     30 
     31 void * my_Realloc(void *p, size_t newSize, size_t oldSize)
     32 {
     33   void *newBuf = my_new(newSize);
     34   if (oldSize != 0)
     35     memcpy(newBuf, p, oldSize);
     36   my_delete(p);
     37   return newBuf;
     38 }
     39 */
     40 
     41 void *
     42 #ifdef _MSC_VER
     43 __cdecl
     44 #endif
     45 operator new(size_t size)
     46 {
     47   // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
     48   void *p = ::malloc(size);
     49   if (p == 0)
     50     throw CNewException();
     51   return p;
     52 }
     53 
     54 void
     55 #ifdef _MSC_VER
     56 __cdecl
     57 #endif
     58 operator delete(void *p) throw()
     59 {
     60   // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
     61   ::free(p);
     62 }
     63 
     64 /*
     65 void *
     66 #ifdef _MSC_VER
     67 __cdecl
     68 #endif
     69 operator new[](size_t size)
     70 {
     71   // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
     72   void *p = ::malloc(size);
     73   if (p == 0)
     74     throw CNewException();
     75   return p;
     76 }
     77 
     78 void
     79 #ifdef _MSC_VER
     80 __cdecl
     81 #endif
     82 operator delete[](void *p) throw()
     83 {
     84   // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
     85   ::free(p);
     86 }
     87 */
     88 
     89 #endif
     90 
     91 #else
     92 
     93 #include <stdio.h>
     94 
     95 // #pragma init_seg(lib)
     96 const int kDebugSize = 1000000;
     97 static void *a[kDebugSize];
     98 static int index = 0;
     99 
    100 static int numAllocs = 0;
    101 void * __cdecl operator new(size_t size)
    102 {
    103   numAllocs++;
    104   void *p = HeapAlloc(GetProcessHeap(), 0, size);
    105   if (index < kDebugSize)
    106   {
    107     a[index] = p;
    108     index++;
    109   }
    110   if (p == 0)
    111     throw CNewException();
    112   printf("Alloc %6d, size = %8u\n", numAllocs, (unsigned)size);
    113   return p;
    114 }
    115 
    116 class CC
    117 {
    118 public:
    119   CC()
    120   {
    121     for (int i = 0; i < kDebugSize; i++)
    122       a[i] = 0;
    123   }
    124   ~CC()
    125   {
    126     for (int i = 0; i < kDebugSize; i++)
    127       if (a[i] != 0)
    128         return;
    129   }
    130 } g_CC;
    131 
    132 
    133 void __cdecl operator delete(void *p)
    134 {
    135   if (p == 0)
    136     return;
    137   /*
    138   for (int i = 0; i < index; i++)
    139     if (a[i] == p)
    140       a[i] = 0;
    141   */
    142   HeapFree(GetProcessHeap(), 0, p);
    143   numAllocs--;
    144   printf("Free %d\n", numAllocs);
    145 }
    146 
    147 #endif
    148 
    149 /*
    150 int MemErrorVC(size_t)
    151 {
    152   throw CNewException();
    153   // return 1;
    154 }
    155 CNewHandlerSetter::CNewHandlerSetter()
    156 {
    157   // MemErrorOldVCFunction = _set_new_handler(MemErrorVC);
    158 }
    159 CNewHandlerSetter::~CNewHandlerSetter()
    160 {
    161   // _set_new_handler(MemErrorOldVCFunction);
    162 }
    163 */
    164