使用Visual Studio的调试工具跟踪内存泄漏是一个系统性的过程,主要包括启用内存泄漏检测、运行程序、分析内存使用情况以及定位泄漏源等步骤。
Visual Studio提供了多种方式来检测内存泄漏,你可以根据自己的需求选择合适的方法。
注意:下面两种方式需要VS使用Debug模式运行,否则无效
一、使用Visual Studio诊断工具:
- 1、运行Visual Studio,并打开并你的项目。
- 2、在“调试”菜单中,选择“启动性能分析(A)”(VS2010)或“性能或诊断”(VS2013)亦或“性能探查器”(VS2022)(大家根据自己安装使用的编译器自行选择)(或使用快捷键Alt+F2)来启动诊断会话。
- 3、在诊断会话中,选择“内存使用率”选项(同样,大家根据自己安装使用的编译器自行找到对应选项),点击开始,即会启动应用程序,并观察内存的使用情况。
- 4、点击“开始”,即会启动应用程序,并观察内存的使用情况。
-
5、 分析内存使用情况
- 在诊断会话中,观察“内存使用”标签页中的实时图表,注意内存使用量的变化趋势。
- 如果图表显示内存使用量持续上升,并且没有合理的解释(如缓存或预期的数据增长),那么可能表明存在内存泄漏。
-
6、定位泄漏源
- 使用Visual Studio的内存分析器:
- 你可以通过Visual Studio的内存分析器工具来跟踪程序在运行过程中分配和释放的内存。
- 执行可能导致内存泄漏的操作后,查看分析结果,找出长时间存活且数量增长的对象。
- 查看这些对象的类型、创建堆栈等信息,以定位代码中的泄漏源。
- 使用Visual Studio的内存分析器:
二、 使用CRT(C运行时)库函数:
- 1、在你的源代码中包含头文件
<crtdbg.h>
。 - 2、在程序的入口处调用
_CrtSetDbgFlag
函数,并设置_CRTDBG_ALLOC_MEM_DF
和_CRTDBG_LEAK_CHECK_DF
标志来启用内存泄漏检测。
如:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
- 3、如果存在申请内存后没有释放,则在程序退出时,会打印内存泄漏信息。
- 如果使用了CRT库函数进行内存泄漏检测,程序退出时会在输出窗口中打印出内存泄漏信息。
- 你可以根据输出信息中的内存地址、大小和调用堆栈来定位泄漏源。
Detected memory leaks!
Dumping objects ->
C:\Users\\TestDemo\MFCApplication1\MFCApplication1\MFCApplication1Dlg.cpp(105) : {339} normal block at 0x00E1AFE8, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
- 4、通过_CrtSetBreakAlloc函数增加内存泄漏位置自动断点
在上述步骤知道了内存异常模块位置为 339,所以
再次运行,程序自动断点:_CrtSetBreakAlloc(339);