#ifndef _MEMTRACE_HPP #define _MEMTRACE_HPP extern "C" { #include <stdio.h> #include <string.h> } struct NEW_STRUCT { void *addr; char* file; int line; char* local; size_t size; 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; char* local = "global"; // 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->size = size; 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 deallocation } 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,"undealloc. segment at address %x from file=%s,\n", (unsigned int)newp->addr,newp->file); fprintf(fp," line=%d, local=%s, size=%u\n", newp->line,newp->local,newp->size); } fflush(fp); } #define new new(__FILE__,__LINE__) #endif // _MEMTRACE_HPP
测试代码:
// leak_trace_test.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "trace.h" class T { public: T (void) { new int;}; }; int _tmain(int argc, _TCHAR* argv[]) { int *i = new int (4); int *ix = new int [5]; T t; new_report (stdout); delete i; delete []ix; new_report (stdout); getchar (); return 0; }
好像MFC实现了这个宏。----:)