本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VS2019下查找,定位和消除内存泄露的方法技巧。
基础配置:1.开发系统:Win10
2.开发IDE: VS2013
问题点列举:这几天公司的SDK在循环测试中发生的几个问题这里作为记录。主要是一下几个问题
一:MFC中CString的泄漏
二:DLL在MFC中应用导致内存增长
三:内存泄漏的调试方法
问题的总结:
一:MFC中CString的泄漏
二:DLL在MFC中应用导致内存增长
在循环测试的过程中发现内存在不停的增长 并且此时我的dll中使用了两个函数 我将函数简化如下但是发现内存依旧会增长。通过查询资料发现 DLL中有全局变量可能会造成这种情况 好吧 也不知道为什么只能这里先做个记录
//其中count为函数计数器
int open()
{
count++;
count--;
return 0;
}
int close()
{
count++;
count--;
return 0;
}
三:内存泄漏的调试方法
这里先列举几个更加详细的使用方法 但是他们都是用vc++ 我这里使用的是vs2019 不过道理都是一样只是函数有所更新
1.关于MFC下检查和消除内存泄露的技巧 链接
2.VS2017的C++开发心得(十一)调试——内存溢出和内存泄漏(上) 链接
3.国外的一篇文章讲的也很不错 https://mariusbancila.ro/blog/2010/07/12/how-to-find-the-source-of-memory-leaks/
我简单的说一下调试步骤
先放个段代码
#include <stdio.h>
//1.放库函数
#define CRTDBG_MAP_ALLOC//这句一定要在库之前
#include <crtdbg.h>
double test()
{
double *t = new double[2];//new的内存并没有释放
return t[2];//访问越界,内存溢出
_CrtDumpMemoryLeaks();//2.放监视的
}
int main()
{
double k = test();
return (int)k;
}
1.添加头文件依赖
#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
2.在怀疑泄漏的函数结尾添加
_CrtDumpMemoryLeaks();
3.切换Debug下调试
4.打开Watch监视器 在Watch窗口中输入(不同的VS版本可能不一样)我使用的是vs2019
(int*){,,msvcr120d.dll}_crtBreakAlloc
5.在此监视下 添加监视参数(后续在添加我的示例图这里先暂时用一下)
比如下面内存泄漏那句 你就可以讲Value设置为86 zai进行Debug 你就会发现运行到泄漏的地方就会停下来哈哈哈
那么怎么判断有内存泄漏呢在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现
Detected memory leaks!
Dumping objects ->
//啊啊啊 我泄露了 我漏了
F: CodeSample Test TestPipe LeakTest MainFrm.cpp(54) : {86} normal block at 0x00422E80, 10 bytes long.
Data: < > 1F 1F 1F 1F 1F CD CD CD CD CD
就有内存泄露。