Source code

Revision control

Copy as Markdown

Other Tools

// NewHandler.cpp↩
#include "StdAfx.h"
#include <stdlib.h>↩
#include "NewHandler.h"
// #define DEBUG_MEMORY_LEAK↩
#ifndef DEBUG_MEMORY_LEAK↩
#ifdef _7ZIP_REDEFINE_OPERATOR_NEW↩
/*↩
void * my_new(size_t size)↩
{↩
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);↩
void *p = ::malloc(size);↩
if (p == 0)↩
throw CNewException();↩
return p;↩
}↩
void my_delete(void *p) throw()↩
{↩
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);↩
::free(p);↩
}↩
void * my_Realloc(void *p, size_t newSize, size_t oldSize)↩
{↩
void *newBuf = my_new(newSize);↩
if (oldSize != 0)↩
memcpy(newBuf, p, oldSize);↩
my_delete(p);↩
return newBuf;↩
}↩
*/
void *↩
#ifdef _MSC_VER↩
__cdecl↩
#endif
operator new(size_t size)↩
{↩
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);↩
void *p = ::malloc(size);↩
if (p == 0)↩
throw CNewException();↩
return p;↩
}↩
void
#ifdef _MSC_VER↩
__cdecl↩
#endif
operator delete(void *p) throw()↩
{↩
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);↩
::free(p);↩
}↩
/*↩
void *↩
#ifdef _MSC_VER↩
__cdecl↩
#endif↩
operator new[](size_t size)↩
{↩
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);↩
void *p = ::malloc(size);↩
if (p == 0)↩
throw CNewException();↩
return p;↩
}↩
void↩
#ifdef _MSC_VER↩
__cdecl↩
#endif↩
operator delete[](void *p) throw()↩
{↩
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);↩
::free(p);↩
}↩
*/
#endif
#else
#include <stdio.h>↩
// #pragma init_seg(lib)↩
const int kDebugSize = 1000000;↩
static void *a[kDebugSize];↩
static int index = 0;↩
static int numAllocs = 0;↩
void * __cdecl operator new(size_t size)↩
{↩
numAllocs++;↩
void *p = HeapAlloc(GetProcessHeap(), 0, size);↩
if (index < kDebugSize)↩
{↩
a[index] = p;↩
index++;↩
}↩
if (p == 0)↩
throw CNewException();↩
printf("Alloc %6d, size = %8u\n", numAllocs, (unsigned)size);↩
return p;↩
}↩
class CC↩
{↩
public:↩
CC()↩
{↩
for (int i = 0; i < kDebugSize; i++)↩
a[i] = 0;↩
}↩
~CC()↩
{↩
for (int i = 0; i < kDebugSize; i++)↩
if (a[i] != 0)↩
return;↩
}↩
} g_CC;↩
void __cdecl operator delete(void *p)↩
{↩
if (p == 0)↩
return;↩
/*↩
for (int i = 0; i < index; i++)↩
if (a[i] == p)↩
a[i] = 0;↩
*/
HeapFree(GetProcessHeap(), 0, p);↩
numAllocs--;↩
printf("Free %d\n", numAllocs);↩
}↩
#endif
/*↩
int MemErrorVC(size_t)↩
{↩
throw CNewException();↩
// return 1;↩
}↩
CNewHandlerSetter::CNewHandlerSetter()↩
{↩
// MemErrorOldVCFunction = _set_new_handler(MemErrorVC);↩
}↩
CNewHandlerSetter::~CNewHandlerSetter()↩
{↩
// _set_new_handler(MemErrorOldVCFunction);↩
}↩
*/