// heaplog.h
#ifndef BRWHEAPLOG_H
#define BRWHEAPLOG_H
extern const char* __file__;
extern size_t __line__;
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
void closeLoggingFile();
#endif
//heaplog.cpp
//#include "BrwHeapLog.h"
#include <stdlib.h>
#include <stdio.h>
#include <WTypes.h>
//typedef hash_map<void*, string> AllocHashMap;
static int AllocCount = 0;
HANDLE& getFileHandle()
{
static HANDLE handle = ::CreateFile(TEXT("\\Release\\MemoryTest.txt"),
GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
return handle;
}
static void writeFile(HANDLE& handle, char* str)
{
::SetFilePointer(handle, 0, NULL, FILE_END);
DWORD writeLen = 0;
::WriteFile(handle, str, strlen(str), &writeLen, NULL);
}
static void recordAlloc(void* p, const char* fileName, size_t line, size_t size)
{
AllocCount += size;
HANDLE& handle = getFileHandle();
char str[1024];
static char* above = "More";
static char* less = "Less";
char* temp = less;
if(size/1024)
temp = above;
sprintf_s(str, "[%d] File-%s Line-%d Size-%d :%s Than 1KB SUM:%d\r\n", p, fileName, line, size, temp, AllocCount);
writeFile(handle, str);
}
static void unrecordAlloc(void* p)
{
HANDLE& handle = getFileHandle();
char str[100];
sprintf_s(str, "[%d] was deleted\r\n",p);
writeFile(handle, str);
}
void closeLoggingFile()
{
::CloseHandle(getFileHandle());
}
const char* __file__ = "unknown";
size_t __line__ = 0;
void* operator new(size_t size)
{
void *ptr = malloc(size);
recordAlloc(ptr,__file__,__line__, size);
__file__ = "unknown";
__line__ = 0;
return ptr;
}
void operator delete(void *ptr)
{
if(ptr)
{
unrecordAlloc(ptr);
free(ptr);
}
}
沒有留言:
張貼留言