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

转载于:https://www.cnblogs.com/wangchengfeng/p/3440143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值