C++通用内存检查

jopen 10年前

由map的升序排列和折半查找想到可以解决一些实际的问题,比如堆内存的管理

#include <cstdio>  #include <map>    #define MEM_NEW(T,n)   mem_alloc<T>(n, __TIME__, __FILE__, __LINE__)  #define MEM_DELETE(p)   if(p)\                                      {\                                          mem_free(p);\                                          p = NULL;\                                      };  #define MEM_CHECK()   mem_check()    struct AllocInfo  {   const char*  time;   const char*  file;   int          line;  };    std::map<void*,AllocInfo> g_UserMem;    /*  *使用模板函数为了new的时候明确类型从而调用构造函数   *明确返回此类的对象指针不必类型转换  */  template<typename T>  T* mem_alloc(int _size,      const char* _time,      const char* _file,      const int _line)  {   void* p = static_cast<void*>(new T[_size]);   if(p)   {    AllocInfo _Info = {_time,_file,_line};    g_UserMem.insert(make_pair(p,_Info));    return static_cast<T*>(p);   }   else   {      return NULL;   }  }    /*  *使用模板函数为了delete时明确类型从而调用析构函数   *找到key对应的内存地址返回迭代器清除容器成员  */  template<typename T>  void mem_free(T* _point)  {   delete[] _point;   g_UserMem.erase(g_UserMem.find(static_cast<void*>(_point)));  }    void mem_check()  {   printf("----------[Memory Check]----------\n");     if(!g_UserMem.size())   {    printf("Memory have all been released\n");    return;   }     printf("Exist memory hasn't be freed:\n");     std::map<void*,AllocInfo>::iterator it_map = g_UserMem.begin();   for(;it_map!=g_UserMem.end();++it_map)   {    if(it_map->first)    {     printf("Memory Allocation Time:[%s]\n\t%s - Line:%d\n",it_map->second.time, it_map->second.file, it_map->second.line);    }   }  }

由于C++的模版不支持头文件和CPP文件分离 所以以上函数定义在头文件中

下面是测试代码

将平时的new和delete操作替换成宏函数即可,在程序退出前检查

#include <iostream>  #include "MemCheck.h"  using namespace std;    class A  {  public:   A()   {    cout<<"A"<<endl;   }     ~A()   {    cout<<"~A"<<endl;   }  };    int main()  {   A *p = MEM_NEW(A,1);   MEM_DELETE(p);   MEM_CHECK();   getchar();   return 0;  }

来自:http://my.oschina.net/mlgb/blog/262943