内存泄露十分讨厌,捕获内存泄露更加令人厌烦……

其实,VS本身就有内存泄露的检测机制。只需做以下操作即可开启。(同时必须在debug模式 下运行程序并且以 正常流程退出 )

  1. // 在入口函数cpp中添加以下定义和头文件
  2. #define CRTDBG_MAP_ALLOC
  3. #include <stdlib.h>
  4. #include <crtdbg.h>
  5. // 在入口函数一开始添加以下代码
  6. _CrtDumpMemoryLeaks();
  7. _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  1. // 在入口函数cpp中添加以下定义和头文件
  2. #define CRTDBG_MAP_ALLOC
  3. #include <stdlib.h>
  4. #include <crtdbg.h>
  5. // 在入口函数一开始添加以下代码
  6. _CrtDumpMemoryLeaks();
  7. _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 CD
Object dump complete.

那么, 如果出现了这种情况, 其实是根本无法知道哪里出了问题。那么这个时候该怎么办呢?

这个时候需要使用这个函数。

  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字
  2. _CrtSetBreakAlloc(num);
  1. //num就是刚刚检测出来的内存泄露的地方大括号内的数字
  2. _CrtSetBreakAlloc(num);

这个函数的作用是,在你运行程序的时候,会在第num次申请空间时断点。

所以,你需要重新运行一遍程序 。(只要流程一样,内存申请顺序肯定是一样的,所以会正确的在需要的地方断掉。)

注意,之前提示的内存泄露中大括号内的数值就是指的第几次申请的空间泄露了。

这个时候查看堆栈调用 ,即可知道到底是在哪里申请了内存但是忘记释放掉了。然后将这块内存在合适的时候释放掉就行了。

最新文章

  1. 转载 什么是P问题、NP问题和NPC问题
  2. SQL转换时间的时分
  3. Linux CentOS 中安装 MySql
  4. sql server 数据误删找回
  5. 代码整洁--使用CodeMaid自动程序排版
  6. the setting of serial port in the SecureCRT
  7. 《MongoDB 权威指南》 学习总结
  8. uva 524 prime ring problem——yhx
  9. 使用支持向量机训练mnist数据
  10. Content Providers详解
  11. Myeclipse 2014 javascript 添加 jquery 代码提示
  12. Web表格
  13. hdu 1175(广搜)
  14. 4. Repeater 实例2
  15. Android常用动画alpha和rotate同时使用
  16. 回车事件jquery
  17. 如何使用ZOL一键安装器下载中关村在线的源安装包
  18. mysql加速导入数据的简单设置
  19. 信步漫谈之Quartz&mdash;分布式调度(整合spring早期版本【低于spring3.1】)
  20. 一般处理程序、Ajax多图片上传带进度条

热门文章

  1. 源码编译安装nginx1.4.7
  2. 生活工作必备之SMART原则
  3. Java桌面程序打包成exe可执行文件
  4. vue系列之生命周期
  5. css之margin
  6. hdu1561 树形dp,依赖背包
  7. bzoj2243树链剖分+区间合并
  8. hdu3308
  9. #ECMASCRIPT6笔记
  10. OpenLDAP在win2008上安装配置