简单的vs内存泄露调试技巧

内存泄露

一、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函数,运行程序后,输出消息窗口显示内存泄露的地方。

_CrtDumpMemoryLeaks();

如果程序有几个出口(return),不需要显式调用_CrtDumpMemoryLeask(),仅用_CrtSetDbgFlag 设置_CRTDBG_ALLOC_MEM_DF and_CRTDBG_LEAK_CHECK_DF即可

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

例1:

  1. #define _CRTDBG_MAP_ALLOC
  2. #include <stdlib.h>
  3. #include <crtdbg.h>
  4. int main()
  5. {
  6.     int *p = (int*)malloc(100);
  7.     _CrtDumpMemoryLeaks();//退出前检查一下内存泄露情况
  8.     return 0;
  9. }

 ①内存泄露的位置,双击到达相关代码。

 ②内存的类型,可以为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. #ifdef _DEBUG
  5. #ifndef DBG_NEW
  6. #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
  7. #define new DBG_NEW
  8. #endif
  9. #endif // _DEBUG
  10. int main()
  11. {
  12. //程序退出前检查内存泄露。
  13. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  14. int *p = new int(0);
  15. return 0;
  16. }

二、在分配内存序号下断点

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

(0)

相关推荐