C++自动检测内存泄漏强悍

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

原文地址:https://www.cnblogs.com/lin1270/p/2202364.html