本文分析了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 你就会发现运行到泄漏的地方就会停下来哈哈哈

MFC的内存泄漏调试方法(MFC中CString的泄漏)(DLL中全局变量导致的内存增长)_Windows

那么怎么判断有内存泄漏呢

在调试状态下运行,程序退出后在"输出窗口"可以看到有无内存泄露。如果出现

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

就有内存泄露。