内存泄露检查之C++实现(一)

2014-11-24 10:54:36 · 作者: · 浏览: 2

从事C++研发的筒子们,最挥之不去可能要算内存泄露带来的痛苦吧,在C++中,虽说其实现底层代码方面所凸显出来的性能要远高于其他类型语言,但是其由于缺乏天生的内存回收机制,从而也被业界予以诟病,那有没有办法能够监测到程序中的内存泄露问题呢,其实是有很多的办法,例如efence ,vagrind类型的工具等,但是这些工具最大的问题就是太重量级了,需要在自己的代码中安插部分调试代码,使用起来也是不很方便,基于此,本人通过学习前人的一些方法,稍微对new,delete进行了重载,基本上实现了检查程序中的内存泄露问题,好了,下面来看代码吧:

#include
  
   
#include
    #include
    
      #include
     
       using namespace boost; #define MEM_CHECK_TABLESIZE 1024*1024 #define MEM_HASH_FUNC(ptr) ((reinterpret_cast
      
       (ptr))%MEM_CHECK_TABLESIZE) #define MEM_FILENAME_SIZE 1024 boost::mutex mut; boost::mutex mem_mut; struct allocMem_ptr_t { allocMem_ptr_t() { bzero(fileName,sizeof(fileName)); size = 0; line = 0; next = NULL; } char fileName[MEM_FILENAME_SIZE]; int size; int line; allocMem_ptr_t* next; }; struct allocMem_ptr_t* allocMem_list[MEM_CHECK_TABLESIZE]; int tableSize = 0; struct memLeak_ptr_t { memLeak_ptr_t() { bzero(fileName,sizeof(fileName)); size = 0; } char fileName[MEM_FILENAME_SIZE]; int size; }; std::map
       
         memLeak_map; void memCheck() { size_t index = 0; mem_mut.lock(); for(int i=0;i
        
         fileName,alloc->line); memLeak.size = alloc->size; memLeak_map.insert(std::make_pair(index,memLeak)); alloc = alloc->next; index++; } } mem_mut.unlock(); std::map
         
           leakCount; for(int i =0;i
          
           ::iterator leakCount_iter; for(leakCount_iter iter = leakCount.begin();iter != leakCount.end();++iter) { printf("%s LEAK MEMORY SIZE:%d\n",iter->
first.c_str(),iter->second); } } void* operator new(size_t size,const char* file,int line) { size_t siz = size + sizeof(allocMem_ptr_t); allocMem_ptr_t* ptr = (allocMem_ptr_t*)::malloc(siz); if(NULL == ptr) abort(); void* p = (char*)ptr + sizeof(allocMem_ptr_t); strncpy(ptr->fileName,file,MEM_FILENAME_SIZE-1); ptr->size = size; ptr->line = line; mem_mut.lock(); size_t index = MEM_HASH_FUNC(p); ptr->next = allocMem_list[index]; allocMem_list[index] = ptr; ++tableSize; mem_mut.unlock(); return p; } void* operator new[](size_t size,const char* file,int line) { return operator new(size,file,line); } void operator delete(void* ptr) { if(NULL == ptr) return; allocMem_ptr_t* pre = NULL; size_t index = MEM_HASH_FUNC(ptr); mem_mut.lock(); allocMem_ptr_t* pointer = allocMem_list[index]; while(pointer) { if((char*)pointer + sizeof(allocMem_ptr_t) == ptr) { if(NULL == pre) allocMem_list[index] = pointer->next; else pre->next = pointer->next; --tableSize; break; } pre = pointer; pointer = pointer->next; } mem_mut.unlock(); free(pointer); } void operator delete[](void* pointer) { operator delete(pointer); } void operator delete(void* pointer,const char* file,int line) { operator delete(pointer); } void operator delete[](void* pointer,const char* file,int line) { operator delete(pointer); }
#ifndef __MEM_CHECK__H
#define __MEM_CHECK__H
#include
  
   
#include
   
     #define MEM_CHECK memCheck() void memCheck(); void* operator new(size_t size,const char* file,int line); void* operator new[](size_t size,const char* file,int line); void operator delete(void* pointer,const char* file,int line); void operator delete[](void* pointer,const char* file,int line); #define MEM_ALLOC new(__FILE__,__LINE__) #define MEM_DELETE delete #endif 
   
  

测试程序:

#include "MemCheck.h"


struct point
{
    point()
    {
        posX = 0;
        posY = 0;
    }
    int posX;
    int posY;
};

int main(int argc,char* argv[])
{
    int* pointer = MEM_ALLOC int();
    double* doub = MEM_ALLOC double();
    std::string* str = MEM