VS2008检测内存泄露
来源:互联网 发布:逆波兰表达式算法 编辑:程序博客网 时间:2024/06/11 00:08
内存泄露十分讨厌,捕获内存泄露更加令人厌烦……
其实,VS本身就有内存泄露的检测机制。只需做以下操作即可开启。(同时必须在debug模式 下运行程序并且以正常流程退出 )
- // 在入口函数cpp中添加以下定义和头文件
- #define CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- // 在入口函数一开始添加以下代码
- _CrtDumpMemoryLeaks();
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
- // 在入口函数cpp中添加以下定义和头文件
- #define CRTDBG_MAP_ALLOC
- #include <stdlib.h>
- #include <crtdbg.h>
- // 在入口函数一开始添加以下代码
- _CrtDumpMemoryLeaks();
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
然后在以 正常流程退出 程序后, 就会在输出窗口显示出内存泄露的信息了。
注意!重点来了。
虽然VS检测出来了哪里有了内存泄露, 但是有可能你得到的有效信息只有两个 (如下)
1. 未释放的内存大小。(绿色部分 )
2. 这块内存是程序中总计第几个被申请的。(蓝色部分 )。
3. 而申请空间所在代码的位置可能不会被显示(删除线部分 )。
Detected memory leaks! Dumping objects -> C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18 } normal block at 0x00780E80, 64 bytes long.Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CDObject dump complete.
那么, 如果出现了这种情况, 其实是根本无法知道哪里出了问题。那么这个时候该怎么办呢?
这个时候需要使用这个函数。
- //num就是刚刚检测出来的内存泄露的地方大括号内的数字
- _CrtSetBreakAlloc(num);
- //num就是刚刚检测出来的内存泄露的地方大括号内的数字
- _CrtSetBreakAlloc(num);
这个函数的作用是,在你运行程序的时候,会在第num次申请空间时断点。
所以,你需要重新运行一遍程序 。(只要流程一样,内存申请顺序肯定是一样的,所以会正确的在需要的地方断掉。)
注意,之前提示的内存泄露中大括号内的数值就是指的第几次申请的空间泄露了。
这个时候查看堆栈调用 ,即可知道到底是在哪里申请了内存但是忘记释放掉了。然后将这块内存在合适的时候释放掉就行了。
- VS2008内存泄露检测
- VS2008内存泄露检测
- VS2008内存泄露检测
- VS2008内存泄露检测
- VS2008内存泄露检测 .
- VS2008内存泄露检测
- VS2008检测内存泄露
- 转:VS2008内存泄露检测
- vs2008 检测内存泄露代码
- VS2008控制台工程检测内存泄露
- vs2008内存泄露检测得到完美解决
- VS2008(Win32控制台该应用程序)内存泄露检测
- vs2008下的MFC程序,怎么检测内存泄露
- 内存泄露检测方法
- 内存泄露检测
- BoundsChecker检测内存泄露
- 内存泄露的检测
- 内存泄露检测相关
- String的使用及注意的地方
- Gradle(一)基本概念
- mysql数据库备份脚本
- 通过连接池获取的连接无效
- 实现自己的ArrayList和HashMap
- VS2008检测内存泄露
- PHP CI框架控制器类名和方法名不一致的错误
- unity3D4.0菜单翻译
- 如何调试具有源代码的dll文件
- 几种非交互执行脚本的方式
- VC++中CEdit控件使用笔记
- C++之模板
- 网页上使用的输入法——Google Transliteration
- FICO常用的IDOC程序、表和IDOC出口