#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实现了这个宏。----:)