#include #include #include #include "memory_check.h" MemoryPositionList::MemoryPositionList(bool mem){ MallocatedMemoryChecked=mem; } void MemoryPositionList::Add(MemoryPosition *item){ mlist.push_back(item); } void MemoryPositionList::Remove(void *ptr){ if(mlist.size()==0) return; std::list::iterator i=mlist.begin(); while (i!=mlist.end()){ if((*i)->ptr==ptr){ mlist.remove(*i); return; } i++; } } void MemoryPositionList::Dump(){ std::list::iterator i=mlist.begin(); if(mlist.size()>0){ if(MallocatedMemoryChecked) fprintf(stderr,"Memory leaks caused by malloc detected:\n"); else fprintf(stderr, "Memory leaks caused by new detected:\n"); while (i!=mlist.end()){ fprintf(stderr,"%X %s\n",(*i)->ptr, (*i)->position); i++; } } } MemoryPositionList::~MemoryPositionList(){ Dump(); std::list::iterator i=mlist.begin(); while(i!=mlist.end()){ if(MallocatedMemoryChecked) free(*i); else delete(*i); i++; } mlist.clear(); } static MemoryPositionList MallocMemory(true); static MemoryPositionList NewMemory(false); void *dmalloc(const char *file, int line, size_t size){ void *ptr=malloc(size); MemoryPosition *m=(MemoryPosition*)malloc(sizeof(MemoryPosition)); m->ptr=ptr; sprintf(m->position,"%s:%d (%d bytes)", file, line, size); MallocMemory.Add(m); return ptr; } void dfree(const char *file, int line, void *ptr){ MallocMemory.Remove(ptr); free(ptr); } void* operator new (size_t size){ void *ptr=malloc(size); return ptr; } void* operator new (size_t size, char const * file, int line){ void *ptr=malloc(size); MemoryPosition *m=(MemoryPosition*) malloc(sizeof(MemoryPosition)); m->ptr=ptr; sprintf(m->position,"%s:%d (%d bytes)", file, line, size); NewMemory.Add(m); return ptr; } void* operator new (size_t size, char const * file, int line, char const *func){ void *ptr=malloc(size); MemoryPosition *m=(MemoryPosition*) malloc(sizeof(MemoryPosition)); m->ptr=ptr; sprintf(m->position,"%s:%d (%d bytes), %s", file, line, size, func); NewMemory.Add(m); return ptr; } void* operator new[] (size_t size){ void *ptr=malloc(size); return ptr; } void* operator new[] (size_t size, char const * file, int line){ void *ptr=malloc(size); MemoryPosition *m=(MemoryPosition*)malloc(sizeof(MemoryPosition)); m->ptr=ptr; sprintf(m->position,"%s:%d (%d bytes)", file, line, size); NewMemory.Add(m); return ptr; } void* operator new[] (size_t size, char const * file, int line, char const *func){ void *ptr=malloc(size); MemoryPosition *m=(MemoryPosition*)malloc(sizeof(MemoryPosition)); m->ptr=ptr; sprintf(m->position,"%s:%d (%d bytes), %s", file, line, size, func); NewMemory.Add(m); return ptr; } void operator delete (void * ptr){ NewMemory.Remove(ptr); free (ptr); } void operator delete[] (void * ptr){ NewMemory.Remove(ptr); free (ptr); }