关于内存泄漏的检查网上有很多的例子和代码,其基本的方法都是用宏,替换掉内存分配以及释放的函数。但是现在网上很多的例子中没有一个是适合我们公司的需求的。
赤峰林西网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。成都创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。
具体的对内存泄漏检查有如下要求:
1. 内存泄漏检查的代码尽可能少的占用CPU及内存
2. 尽可能的不影响原程序
因为,我们的服务器程序有泄漏而且是特殊情况下会泄漏,平时很难模拟出来。
对于这种情况下的内存泄漏我以前的做法如下:
1. 用写文件的方法记录所有的内存分配以及释放的操作
2. 再写一个工具去分析所有的记录,从中找出泄漏的代码
这样做需要大量的硬盘空间,不过,这个无所谓了现在硬盘很便宜!
不过需要考虑到服务器程序当中包含了exe以及多个dll,为了通用,内存泄漏检查分为下面几个部分:
1. IMemLeak.h IMemLeak.cpp 加入每一个模块当中
2. MemLeakLog.dll 统一记录所有的内存操作,将其记录到文件当中
3. MemCheckTool.exe 分析工具
- //IMemLeak.h
- #ifndef _YG_MEMDBG_H_
- #define_YG_MEMDBG_H_
- #include
- //Redefines
- #definemalloc(size) mallocb(size, __FILE__, __LINE__)
- #definefree(memblock) freeb(memblock, __FILE__, __LINE__)
- #definerealloc(memblock, size) reallocb(memblock, size, __FILE__, __LINE__)
- #definecalloc(num, size) callocb(num, size, __FILE__, __LINE__)
- //Redefined functions
- void* mallocb(size_t size, constchar*pszFile, intnLine);
- voidfreeb(void*memblock, constchar*pszFile, intnLine);
- void* reallocb(void*memblock, size_t size, constchar*pszFile, intnLine);
- void* callocb(size_t num, size_t size, constchar*pszFile, intnLine);
- //For C++
- void* operatornew(size_t size, constchar*pszFile, intnLine);
- void* operatornew[](size_t size, constchar*pszFile, intnLine);
- voidoperatordelete(void*pvMem) throw();
- voidoperatordelete[](void*pvMem) throw();
- voidpre_delete(constchar*pszFile, intnLine);
- //Redefine new and delete
- #definenewnew(__FILE__, __LINE__)
- #definedelete pre_delete(__FILE__, __LINE__),delete
- #endif
- //IMemLeak.cpp
- #include
- #include
- #include
- #include
- #include
- #include
- enumEOperateType
- {
- Type_Malloc,
- Type_Calloc,
- Type_Realloc,
- Type_New,
- Type_New_Array,
- Type_Free,
- Type_Delete,
- Type_Delete_Array
- };
- typedef void(__stdcall * pFun_MemLeakLog)(LPCSTR PLog);
- pFun_MemLeakLog MemLeakLog = NULL;
- voidCheckMemLeakLogDLL()
- {
- if(MemLeakLog == NULL)
- {
- HINSTANCE hinstLib = LoadLibrary(_T("MemLeakLog.dll"));
- if(hinstLib != NULL)
- {
- MemLeakLog = (pFun_MemLeakLog)GetProcAddress(hinstLib, "MemLeakLog");
- }
- }
- }
- voidLog(EOperateType type, void* pmem, size_t size, intnLine, constchar* pszFile)
- {
- CheckMemLeakLogDLL();
- chartemp[1024];
- if(MemLeakLog != NULL)
- {
- memset(temp, 0, 1024);
- sprintf_s(temp, 1024, "%d-%p-%d-%d [%s] ", type, pmem, size, nLine, pszFile);
- MemLeakLog(temp);
- }
- }
- void* mallocb(size_t size, constchar*pszFile, intnLine)
- {
- void* pRet = malloc(size);
- Log(Type_Malloc, pRet, size, nLine, pszFile);
- returnpRet;
- }
- void* callocb(size_t num, size_t size, constchar*pszFile, intnLine)
- {
- void* pRet = calloc(num, size);
- Log(Type_Calloc, pRet, size, nLine, pszFile);
- returnpRet;
- }
- voidfreeb(void*memblock, constchar*pszFile, intnLine)
- {
- if(memblock)
- {
- Log(Type_Free, memblock, 0, 0, "NULL");
- }
- free(memblock);
- }
- void* reallocb(void*memblock, size_t size, constchar*pszFile, intnLine)
- {
- void* pRet;
- pRet = realloc(memblock, size);
- Log(Type_Free, memblock, size, nLine, pszFile);
- Log(Type_Realloc, pRet, size, nLine, pszFile);
- returnpRet;
- }
- void* operatornew(size_t size, constchar*pszFile, intnLine)
- {
- void* pRet = malloc(size);
- Log(Type_New, pRet, size, nLine, pszFile);
- returnpRet;
- }
- void* operatornew[](size_t size, constchar*pszFile, intnLine)
- {
- void* pRet = malloc(size);
- Log(Type_New_Array, pRet, size, nLine, pszFile);
- returnpRet;
- }
- //#include
- voidoperatordelete(void*memblock) throw()
- {
- if(memblock)
- {
- Log(Type_Delete, memblock, 0, 0, "NULL");
- }
- free(memblock);
- }
- voidoperatordelete[](void*memblock) throw()
- {
- if(memblock)
- {
- Log(Type_Delete_Array, memblock, 0, 0, "NULL");
- }
- free(memblock);
- }
- voidpre_delete(constchar*pszFile, intnLine)
- {
- }
注意:
a. 输出的目录我是写死了,在D:MemLeak_Log
b. 在被检查工程里面请增加/FC选项。Project->Properties->Configuration->C/C++->Advanced->Use Full Path Yes(/FC)
c. MemLeakLog.dll 拷贝到与被检查内存泄漏的进程所在的目录下面
我附带上一个例子,大家一看就明白了。
下载地址:http://down./data/236002
网站栏目:教你如何实现内存泄漏检查
文章位置:http://www.shufengxianlan.com/qtweb/news28/83178.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联