void *operator new(size_t size)
{
void *p;
size_t newSize = size + strlen(Sentinel) + sizeof(size_t);
if((p = malloc(size)) == 0)
{
return 0;
}
char *s = (char*)p;
strcpy(s+size, Sentinel);
//size_t is of size 2 bytes.
s[newSize - 2] = (size >> 8); //highbyte
s[newSize - 1] = (size); //lowbyte
p = (void*)s;
//Log the amount of memory used.
return p;
}
//Delete operator similar except it searches for the Sentinel and then
//gets the size (which does not work)
struct MemoryEntry {
void * memory;
size_t size;
int valid;
MemoryEntry()
: memory(0), size(0), valid(0)
{}
};
class Logger {
ofstream logFile;
long memoryUsed;
int index;
MemoryEntry memory[150];
Logger(const char * fileName);
void LogHeader();
void LogMemoryStatus();
public :
~Logger();
static Logger* GetInstance();
void AddMemoryEntry(MemoryEntry & e);
void RemoveMemoryEntry(void * p);
void LogTime();
void LogConstructor();
void LogDestructor();
void LogFunction();
void LogError();
Logger & operator<<(const char * a);
Logger & operator<<(char a);
Logger & operator<<(int a);
Logger & operator<<(float a);
Logger & operator<<(long a);
Logger & operator<<(double a);
Logger & operator<<(unsigned char a);
Logger & operator<<(unsigned int a);
Logger & operator<<(unsigned long a);
Logger & operator<<(void * a);
};
#ifdef _MEMORY_DEBUG_
void *operator new(size_t size)
{
void *p;
Logger * Log = Logger::GetInstance();
if((p = malloc(size)) == 0)
{
Log->LogError();
*Log << "Memory Allocation Failure\n";
exit(1);
}
MemoryEntry e;
e.memory = p;
e.size = size;
e.valid = true;
Log->AddMemoryEntry(e);
return p;
}
void operator delete(void *p)
{
if(p == 0)
return;
Logger * Log = Logger::GetInstance();
Log->RemoveMemoryEntry(p);
if(p)
free(p);
p = 0;
}
#endif
Logger * Logger::GetInstance()
{
static Logger log(FILENAME);
return &log;
}
Logger::Logger(const char * fileName)
{
#ifdef _DEBUG_
logFile.open(fileName, ios::app);
#endif
memoryUsed = 0;
index = 0;
LogHeader();
}
Logger::~Logger()
{
LogMemoryStatus();
#ifdef _MEMORY_DEBUG_
logFile << "\nIndex - Size - Valid\n";
for(int i = 0; i<index; i++)
{
logFile << setw(5) << i << " " << setw(5)
<<memory.size << " - "
<< memory.valid << "\n";
}
int numLeft=0;
logFile << "\nCleaning up Memory\n";
for(i = 0; i<index; i++)
if(memory.valid == 1)
{
numLeft++;
memoryUsed -= memory.size;
LogTime();
logFile << "--- - "
<< setw(5) << memory.size
<< " bytes DeAllocated - "
<< setw(6) << memoryUsed
<< " - " << setw(2) << i << "\n";
memory.valid = 0;
}
#endif
logFile << "---------------------------\n\n\n\n";
logFile.close();
}
void Logger::AddMemoryEntry(MemoryEntry & e)
{
memory[index] = e;
memoryUsed += e.size;
LogTime();
logFile << "--- - " << setw(5) << e.size
<< " bytes Allocated - " << setw(6) << memoryUsed
<< " - " << setw(2) << index << "\n";
index++;
}
void Logger::RemoveMemoryEntry(void *p)
{
for(int i=0; i< index; i++)
{
if(memory.memory == p)
{
memoryUsed -= memory.size;
LogTime();
logFile << "--- - " << setw(5) << memory.size
<< " bytes DeAllocated - "
<< setw(6) << memoryUsed << " - "
<< setw(2) << i << "\n";
memory.valid = 0;
return;
}
}
LogError();
logFile << "Could not find memory address in table - Deleteing Anyway\n";
}
10/04/07 ---- 03:19:31 ----
03:19:31 : --- - 56 bytes Allocated - 56 - 0
03:19:31 : --- - 516 bytes Allocated - 572 - 1
03:19:31 : --- - 56 bytes Allocated - 628 - 2
03:19:31 : --- - 516 bytes Allocated - 1144 - 3
03:19:31 : --- - 56 bytes Allocated - 1200 - 4
03:19:31 : --- - 516 bytes Allocated - 1716 - 5
03:19:31 : -C- - VGA
03:19:31 : --- - 64000 bytes Allocated - 65716 - 6
03:19:31 : --- - 64000 bytes Allocated - 129716 - 7
03:19:31 : -C- - Bitmap - \B1.bmp
03:19:31 : -F- - Bitmap Open
03:19:31 : --- - 516 bytes Allocated - 130232 - 8
03:19:31 : --- - 64000 bytes Allocated - 194232 - 9
03:19:31 : --- - 516 bytes DeAllocated - 193716 - 8
03:19:31 : -D- - Bitmap
03:19:31 : --- - 64000 bytes DeAllocated - 129716 - 9
03:19:31 : -D- - VGA
03:19:31 : -E- - Could not find memory address in table - Deleteing Anyway
03:19:31 : -E- - Could not find memory address in table - Deleteing Anyway
129716 B of Memory Allocated from the Heap Left.
Index - Size - Valid
0 56 - 1
1 516 - 1
2 56 - 1
3 516 - 1
4 56 - 1
5 516 - 1
6 64000 - 1
7 64000 - 1
8 516 - 0
9 64000 - 0
Cleaning up Memory
03:19:31 : --- - 56 bytes DeAllocated - 129660 - 0
03:19:31 : --- - 516 bytes DeAllocated - 129144 - 1
03:19:31 : --- - 56 bytes DeAllocated - 129088 - 2
03:19:31 : --- - 516 bytes DeAllocated - 128572 - 3
03:19:31 : --- - 56 bytes DeAllocated - 128516 - 4
03:19:31 : --- - 516 bytes DeAllocated - 128000 - 5
03:19:32 : --- - 64000 bytes DeAllocated - 64000 - 6
03:19:32 : --- - 64000 bytes DeAllocated - 0 - 7
---------------------------