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

  • 相关阅读:
    自动化测试
    django
    Linux软件推荐
    deepin升级20.1(2021.3)
    struts_自定义日期类型转换器
    struts_01
    JAVA面向对象思想
    springmvc 文件上传
    ajax+struts2 实现省份-城市-地区三级联动
    mybatis——分页插件
  • 原文地址:https://www.cnblogs.com/lin1270/p/2202364.html
Copyright © 2020-2023  润新知