关于VS2008中C/C++内存泄漏的定位的方法
来源:互联网 发布:php用逗号拼接字符串 编辑:程序博客网 时间:2024/06/06 03:44
联系方式:uestc001@gmail.com,欢迎转载,请注明出处:http://blog.csdn.net/uestc001/article/details/8349125
1、最主要的就是_CrtDumpMemoryLeaks函数,请看MSDN介绍。
首先,定义一个头文件,用其重定义一下new操作符。
下面就是这个:myMemoryNew.h
- #ifndef _MYMEMORYNEW_H
- #define _MYMEMORYNEW_H
- #ifdef _DEBUG
- #include <crtdbg.h>
- #define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)
- #else
- #define DEBUG_NEW new
- #endif
- #endif //_MYMEMORYNEW_H
#ifndef _MYMEMORYNEW_H#define _MYMEMORYNEW_H#ifdef _DEBUG#include <crtdbg.h>#define DEBUG_NEW new(_NORMAL_BLOCK ,__FILE__, __LINE__)#else#define DEBUG_NEW new#endif#endif //_MYMEMORYNEW_H
其次,CrtDumpMemoryLeaks()就是显示当前的内存泄漏。注意是“当前”,也就是说当它执行时,所有未销毁的对象均会报内存泄漏。所以,让这条语句在程序的最后执行即main函数的return 0前边最好。
例子1:
- /***************************************
- *Copyright by 蓝胖子
- *Author : 蓝胖子
- *Email : uestc001@gmail.com
- *Date : 2012.12.20
- *Modefy :2012.12.20
- ***************************************/
- #include <iostream>
- using namespace std;
- /*************************************/
- #ifdef _DEBUG
- #include "myMemoryNew.h"
- #define new DEBUG_NEW
- #endif
- /*************************************/
- void GetMemory(char **str)
- {
- *str =new char[10 * sizeof(char)];
- }
- int main()
- {
- char *str = NULL;
- GetMemory(&str);
- strcpy(str, "abc");
- printf("%s\n", str);
- _CrtDumpMemoryLeaks();//重要语句
- return 0;
- }
/****************************************Copyright by 蓝胖子*Author : 蓝胖子*Email : uestc001@gmail.com*Date : 2012.12.20*Modefy :2012.12.20***************************************/#include <iostream>using namespace std;/*************************************/#ifdef _DEBUG#include "myMemoryNew.h"#define new DEBUG_NEW#endif /*************************************/void GetMemory(char **str){*str =new char[10 * sizeof(char)];}int main(){char *str = NULL;GetMemory(&str);strcpy(str, "abc");printf("%s\n", str);_CrtDumpMemoryLeaks();//重要语句return 0;}
测试结果:
可以看到准确定位:在21行存在泄漏即new了之后没有delete[]和置为NULL。
2、还有一个Visual Leak Detector[点我下载],相当厉害。请参考博文:Visual Leak Detector 2.2.3 Visual C++内存检测工具
我在安装配置好了,出现不能正常使用是问题,折腾了一个小时,后来安装了全部vc运行库[点我下载],可正常!
ps:我Qt写的测试界面存在也有泄漏,寒!而且泄漏也被检测到了。
如图:
同样用前文的例子如下:
- /***************************************
- *Copyright by 蓝胖子
- *Author : 蓝胖子
- *Email : uestc001@gmail.com
- *Date : 2012.12.20
- *Modefy :2012.12.20
- ***************************************/
- #include <iostream>
- #include "vld.h"
- using namespace std;
- void GetMemory(char **str)
- {
- *str =new char[10 * sizeof(char)];
- }
- int main()
- {
- char *str = NULL;
- GetMemory(&str);
- strcpy(str, "abc");
- printf("%s\n", str);
- delete []str;
- str = NULL;
- return 0;
- }
/****************************************Copyright by 蓝胖子*Author : 蓝胖子*Email : uestc001@gmail.com*Date : 2012.12.20*Modefy :2012.12.20***************************************/#include <iostream>#include "vld.h"using namespace std;void GetMemory(char **str){*str =new char[10 * sizeof(char)];}int main(){char *str = NULL;GetMemory(&str);strcpy(str, "abc");printf("%s\n", str);delete []str;str = NULL;return 0;}
检测结果:
可以看到,定位准确。
修改加上:
- delete []str;
- str = NULL;
delete []str;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
(完)
此文章来自于【http://blog.csdn.net/uestc001/article/details/8349125】
- 关于VS2008中C/C++内存泄漏的定位的方法
- C语言中内存泄漏的检测方法
- 处理C#, JAVA内存泄漏的方法
- 处理C#, JAVA内存泄漏的方法
- C/C++检测内存泄漏的方法
- VS2008检测内存泄漏的方法
- VC定位内存泄漏的方法
- linux下c检查内存泄漏的简单方法
- 关于内存泄漏检测的一些方法
- 浅析C/C++内存泄漏的解决办法
- linux下检测和定位内存泄漏位置的方法
- 在Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
- 在Linux平台中调试C/C++内存泄漏方法 (腾讯和MTK面试的时候问到的)
- 关于ie中jscript的内存泄漏
- 在 Linux 平台中调试 C/C++ 内存泄漏方法
- 在 Linux 平台中调试 C/C++ 内存泄漏方法
- 在 Linux 平台中调试 C/C++ 内存泄漏方法
- 在 Linux 平台中调试 C/C++ 内存泄漏方法
- Android中SQLite的使用
- GEF 进阶,第三部分: Layer
- dotnet程序安装包添加卸载快捷方式
- 【并查集入门】HDU1232——畅通工程
- java版本的escape和unescape函数
- 关于VS2008中C/C++内存泄漏的定位的方法
- 【分布式系统工程实现】如何检测一台机器是否宕机?
- opencv中自带blobtrack运行演示
- uva10054-The Necklace(项链)
- 数据类型相互转换
- 招聘中级测试工程师、开发测试工程师各一名
- lease 分布式
- SEO网络优化方法
- 50个必备的实用jQuery代码段