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

其实,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次申请空间时断点。

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

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

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

VS2008中捕获内存泄露(转)的更多相关文章

  1. 查找并修复Android中的内存泄露—OutOfMemoryError

    [编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...

  2. 利用Instrument Leak来发现App中的内存泄露

    XCode提供了一组用于检测内存,调试动画,布局等的工具.对于调试一些性能问题,内存问题非常方便.这里我们使用Leak来发现代码中的内存泄露. 在Leak中启动我们的应用开始监控: 注意,在监控的时候 ...

  3. Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  4. LeakCanary——直白的展现Android中的内存泄露

    之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...

  5. Java中的内存泄露 和 JVM GC(垃圾回收机制)

    一.什么是Java中的内存泄露? 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点, 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连:其次,这些对象是无用的,即程序以 ...

  6. Qt应用中检测内存泄露——VLD

    本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...

  7. C++中避免内存泄露常见的解决方式

    常见内存泄露及解决方式-选自ood启发录 new/delete, array new/arrray delete匹配 case 1: 在类的构造函数与析构函数中没有匹配地调用 new/delete! ...

  8. [lua] mac上如何编译snapshot(检测Lua中的内存泄露)

    最近我们的unity手游频繁闪退,只要进入战斗场景,之后一段时间就会闪退,如果是在unity编辑器中则会报出not enough memory的错误!猜测应该是有内存泄漏: 由于我们使用了tolua, ...

  9. Java中的内存泄露的几种可能

    Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发 ...

随机推荐

  1. oracle:储存过程实现分页

    CREATE OR REPLACE PACKAGE PKG_QUERY IS -- Author : ADMINISTRATOR -- Created : 2016/12/8 星期四 10:28:37 ...

  2. wpf让图片自适应容器大小,而且又不会拉升变形

    <Grid Grid.Column="3" Margin="0,4,0,0" Background="Black"> <V ...

  3. js获取当前有效样式

      js获取有效样式   节点.currentStyle["属性名"]        兼容ie方法(只有ie有效) getcomputedStyle(节点)["属性名&q ...

  4. 2017-2018-2 20155309南皓芯 Exp8 WEB基础实践

    基础问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本 ...

  5. 使用sshtunnel实现python公网连接阿里云mongo服务器

    背景: 公司使用阿里云的云数据库MongoDB.基于安全原因考虑,阿里云MongoDB云数据库目前只支持从阿里云ECS上访问,无法通过公网直接访问,不方便用户在本地开发环境里直接进行测试. 阿里云官方 ...

  6. 谈谈java多线程(一)

    其实很早就想写一些java多线程方面的文章,只是奈何这东西看着简单,但要真要理解和正确使用可能还需要花费一定的精力,虽然平时的工作中会用到这方面的知识,可是更多的只是为了完成工作,至于详细的东西,也没 ...

  7. BZOJ4034 [HAOI2015]树上操作 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...

  8. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

  9. 想要进步,就要阅读大神的博客,再推荐一波springmvc映射路径之url的action请求

    http://www.cnblogs.com/liukemng/p/3726897.html

  10. 解决eclipse部署项目各种乱码问题,推荐一下别人的做法

    http://blog.sina.com.cn/s/blog_62aab2760100l1hx.html