#ifndef _MEMTRACE_HPP #define _MEMTRACE_HPP extern "C" { #include #include } struct NEW_STRUCT { void *addr; char* file; int line; char* local; struct NEW_STRUCT* next; }; typedef NEW_STRUCT NEW; NEW* newlist = 0; void* operator new(size_t size,const char* file,int line,char* local) { void *p; NEW* newp; // every allocation should be checked and exception thrown if error newp = (NEW*) malloc(sizeof(NEW)); newp->addr = malloc(size); newp->file = strdup(file); newp->line = line; newp->local = strdup(local); newp->next = newlist; newlist = newp; return newp->addr; } void operator delete(void* p) { NEW *newp, *newp1; if (newlist == 0) { // here we should throw, spurious deallocation return; } if (newlist->addr == p) { newp = newlist; newlist = newlist->next; free(newp->file); free(newp->local); free(newp); return; } for(newp1 = newlist, newp=newlist->next; newp != 0; newp1=newp, newp = newp->next) { if (newp->addr == p) { newp1->next = newp->next; free(newp->file); free(newp->local); free(newp); return; } } // here we should throw, spurious delloaction } void operator delete(void *p,const char* file,int line,char* local) { operator delete(p); } void new_report(FILE *fp) { NEW* newp; if (newlist == 0) { fprintf(fp,"all deallocated :-)\n"); fflush(fp); return; } for(newp = newlist; newp != 0; newp=newp->next) { fprintf(fp,"undeallocated segment at address %x from file=%s,\n", newp->addr,newp->file); fprintf(fp," line=%d, local=%s\n",newp->line,newp->local); } fflush(fp); } #endif // _MEMTRACE_HPP