内存泄露问题

  • 工具1:



    vld内存泄露检测工具 VC++6.0/VS2005均可用


    使用方法:在#include “stdafx.h”之后添加
                           #ifndef VLD_H
                          #include “vld.h”
                          #endif

    //ps:我自己在VC6.0试的时候报错如下:
    //d:\program files\visual leak detector\include\vld_def.h(45) : error C2061: syntax error : identifier 'wchar_t'
    //谁能告诉我怎么解决了?

    工具2:  boundschecker 这个工具我只集成到vc++6.0中,没有使用,网上评价褒贬不一

    工具3: 检测OPENCV内存泄露的工具,OPENCV中文论坛上有人写的Memtracker


    .h文件
    #ifndef OPENCV_MEM_TRACKER_H
    #define OPENCV_MEM_TRACKER_H
    #include <stdio.h>
    #include <vector>
    
    
    // 内存泄漏追踪
    
    
    class MemTracker
    {
    public:
       MemTracker(void);
       ~MemTracker(void);
    
    
    private:
    
    
       // 登记分配/释放的内存
    
    
       void regAlloc(void *ptr, size_t size);
       void regFree(void *ptr);
    
    
       // 输出泄漏的内存
    
    
       int output(FILE* fp=stderr);
    
    
    private:
      
       // 分配内存
    
    
       static void* alloc_func(size_t size, void *userdata);
    
    
       // 释放内存
    
    
       static int free_func(void *ptr, void *userdata);
    
    
    private:
    
    
     struct Ptr
     {
      void *ptr;      // 内存地址
      size_t size;   // 内存大小
      int   id;
    
    
      Ptr(void *ptr, size_t size, int id)
      {
       this->ptr = ptr;
       this->size = size;
       this->id = id;
      }
     };
       // 记录当前使用中的内存
    
    
       std::vector<Ptr>   m_memTracker;
       // alloc_func对应的编号
    
    
       int               m_id;
       // 要检查的地址
    void*  m_address;
    
    
    };
    
    
    #endif   // OPENCV_MEM_TRACKER_H






      .cpp文件
    #include “stdafx.h”
    
    
    #include “MemTracker.h”
    
    
    #include <assert.h>
    #include <cv.h>
    #include <cxcore.h>
    
    
    MemTracker::MemTracker(void)
    {
     m_id = 0;
     m_address = NULL;
       // 注册管理函数
       cvSetMemoryManager(alloc_func, free_func, (void*)this);
    }
    
    
    MemTracker::~MemTracker(void)
    {
       // 取消管理函数
    
    
       cvSetMemoryManager(NULL, NULL, NULL);
    
    
       // 输出结果
    
    
       this->output();
    }
    
    
    // 登记分配/释放的内存
    
    
    void MemTracker::regAlloc(void *ptr, size_t size)
    {
       // 每次记录一个新的m_id
       m_memTracker.push_back(Ptr(ptr, size, m_id++));
    }
    
    
    void MemTracker::regFree(void *ptr)
    {
       int i;
       for(i = 0; i < m_memTracker.size(); ++i)
       {
          // 删除记录
    
    
          if(m_memTracker[i].ptr == ptr)
          {
             m_memTracker[i] = m_memTracker[m_memTracker.size()-1];
             m_memTracker.pop_back();
             return;
          }
       }
    }
    
    
    // 输出泄漏的内存
    
    
    int MemTracker::output(FILE* fp)
    {
      int n = m_memTracker.size();
      int i;
    
    
       for(i = 0; i < n; ++i)
       {
       //   fprintf(fp, “%d: %p, %u\n”, m_memTracker[i].id, m_memTracker[i].ptr, m_memTracker[i].size);
       TRACE(“%d: %p, %u\n”, m_memTracker[i].id, m_memTracker[i].ptr, m_memTracker[i].size);
       }
       return n;
    }
    
    
    // 分配内存
    void* MemTracker::alloc_func(size_t size, void *userdata)
    {
       assert(size > 0 && userdata != NULL);
    
    
       // 分配内存
       void *ptr = malloc(size);
       if(!ptr) return NULL;
    
    
       // 登记
       MemTracker *tracker = (MemTracker*)userdata;
       tracker->regAlloc(ptr, size);
    
    
       if(ptr == (void*)0×03480040) // 该地址为内存泄露的地址
       {
          //设置断点即可查出内存泄露的语句
       }
    
    
       return ptr;
    }
    
    
    // 释放内存
    int MemTracker::free_func(void *ptr, void *userdata)
    {
       assert(ptr != NULL && userdata != NULL);
    
    
       // 释放内存
       free(ptr);
       // 登记
       MemTracker *tracker = (MemTracker*)userdata;
       tracker->regFree(ptr);
       // CV_OK == 0
       return 0;
    }
    

    文章来源: http://shijuanfeng.blogbus.com/logs/100675119.html


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值