现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

关于VS2008中C/C++内存泄漏的定位的方法

2013-01-13 22:25 工业·编程 ⁄ 共 3006字 ⁄ 字号 暂无评论

1、最主要的就是_CrtDumpMemoryLeaks函数,请看MSDN介绍。

首先,定义一个头文件,用其重定义一下new操作符。

》》》C++中避免内存泄漏的几个绝招

下面就是这个:myMemoryNew.h

  1. #ifndef _MYMEMORYNEW_H
  2. #define _MYMEMORYNEW_H
  3. #ifdef _DEBUG
  4. #include <crtdbg.h>
  5. #define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)
  6. #else
  7. #define DEBUG_NEW new
  8. #endif
  9. #endif //_MYMEMORYNEW_H

其次,CrtDumpMemoryLeaks()就是显示当前的内存泄漏。注意是“当前”,也就是说当它执行时,所有未销毁的对象均会报内存泄漏。所以,让这条语句在程序的最后执行即main函数的return 0前边最好。

例子1:

  1. /***************************************
  2. *Copyright by 蓝胖子
  3. *Author : 蓝胖子
  4. *Email : uestc001@gmail.com
  5. *Date : 2012.12.20
  6. *Modefy :2012.12.20
  7. ***************************************/
  8. #include <iostream>
  9. using namespace std;
  10. /*************************************/
  11. #ifdef _DEBUG
  12. #include "myMemoryNew.h"
  13. #define new DEBUG_NEW
  14. #endif
  15. /*************************************/
  16. void GetMemory(char **str)
  17. {
  18. *str =new char[10 * sizeof(char)];
  19. }
  20. int main()
  21. {
  22. char *str = NULL;
  23. GetMemory(&str);
  24. strcpy(str, "abc");
  25. printf("%s\n", str);
  26. _CrtDumpMemoryLeaks();//重要语句
  27. return 0;
  28. }

测试结果:

可以看到准确定位:在21行存在泄漏即new了之后没有delete[]和置为NULL

2、还有一个Visual Leak Detector[点我下载],相当厉害。请参考博文:Visual Leak Detector 2.2.3 Visual C++内存检测工具

我在安装配置好了,出现不能正常使用是问题,折腾了一个小时,后来安装了全部vc运行库[点我下载],可正常!

ps:我Qt写的测试界面存在也有泄漏,寒!而且泄漏也被检测到了。

如图:

同样用前文的例子如下:

  1. /***************************************
  2. *Copyright by 蓝胖子
  3. *Author : 蓝胖子
  4. *Email : uestc001@gmail.com
  5. *Date : 2012.12.20
  6. *Modefy :2012.12.20
  7. ***************************************/
  8. #include <iostream>
  9. #include "vld.h"
  10. using namespace std;
  11. void GetMemory(char **str)
  12. {
  13. *str =new char[10 * sizeof(char)];
  14. }
  15. int main()
  16. {
  17. char *str = NULL;
  18. GetMemory(&str);
  19. strcpy(str, "abc");
  20. printf("%s\n", str);
  21. delete []str;
  22. str = NULL;
  23. return 0;
  24. }

检测结果:

可以看到,定位准确。

修改加上:

  1. delete []str;
  2. str = NULL;

结果:

vs2008提示窗口的说明:

Call Stack:泄露内存的调用堆栈,显示了泄露资源创建的位置,双击便定位到相应的行。

Data:泄露内存的内容。

总结:推荐使用Visual Leak Detector,好用、免费、准确。

Visual Leak Detector以后,debug下,运行速度明显慢,和Visual Leak Detector机制有关。

参考:

1、http://blog.csdn.net/hhygcy/article/details/4103155

2、http://blog.csdn.net/akof1314/article/details/7549979

(完)

给我留言

留言无头像?