-
工具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; }
内存泄露问题
最新推荐文章于 2024-03-09 12:50:25 发布