C++内存泄露调试
我在看DirectX Sample的时候,看到以下代码:
1 // Enable run-time memory check for debug builds. 2 #if defined(DEBUG) | defined(_DEBUG) 3 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
既然是debug,肯定是多输出了什么信息,根据注释来看,应该是可以检测出内存使用的相关错误。而在C++中,内存泄露一直是一个很蛋疼的问题,以前不知道有什么方法解决。顺着这段代码上网搜了下,果然有内存泄露的检测。
以下转自http://blog.csdn.net/hayyoung/article/details/8565871
一、vs监测内存泄露,利用crt库就可以,不需要利用专门的工具。操作仅2步。
1、增加宏和头文件
1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h>
注意:为了保证这三行代码的顺序,最前面放这三行代码。假设我们在这3行之前,增加#include <iostream>, 因iostream包含了stdlib.h,则会隐式破坏顺序,导致malloc函数内存泄露的时候,输出信息窗口不显示具体的行数。
2、程序仅一个出口(return),在需要监测地方,调用_CrtDumpMemoryLeask函数,运行程序后,输出消息窗口显示内存泄露的地方。
1 _CrtDumpMemoryLeaks();
如果程序有几个出口(return),不需要显式调用_CrtDumpMemoryLeask(),仅用_CrtSetDbgFlag 设置_CRTDBG_ALLOC_MEM_DF and_CRTDBG_LEAK_CHECK_DF即可
1 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
例1:
1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h> 4 5 int main() 6 { 7 int *p = (int*)malloc(100); 8 _CrtDumpMemoryLeaks();//退出前检查一下内存泄露情况 9 return 0; 10 }
①内存泄露的位置,双击到达相关代码。
②内存的类型,可以为normal, client, crt。
③泄露内存大小,这里泄露了100。
注意:利用new的分配内存,定义下面的宏,以便显示内存泄露的具体位置。
1 #ifdef _DEBUG 2 #ifndef DBG_NEW 3 #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) 4 #define new DBG_NEW 5 #endif 6 #endif // _DEBUG
例2:
1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h> 4 5 #ifdef _DEBUG 6 #ifndef DBG_NEW 7 #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ) 8 #define new DBG_NEW 9 #endif 10 #endif // _DEBUG 11 12 int main() 13 { 14 //程序退出前检查内存泄露。 15 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 16 int *p = new int(0); 17 return 0; 18 }
二、在分配内存序号下断点
1、在程序的开头设置断点,然后f5运行程序。
2、在程序中断的时候,打开监视窗口。
3、如果运行库是/MDd输入_crtBreakaAlloc。否则是/MTd输入{,,msvcr90d.dll}_crtBreakAlloc(vs2010是{,,msvcr100d.dll}_crtBreakAlloc其他版本类推),
默认没下断点是-1,这里我们修改,设置在分配序号52内存块下断点(记得回车,变红色才是修改成功)。
4、继续运行,下断成功。
参考资料:http://msdn.microsoft.com/en-us/library/x98tx3cf%28v=vs.90%29.aspx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述