• VS2008中捕获内存泄露


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

    其实,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 );  

    然后在 正常流程退出 程序后, 就会在输出窗口显示出内存泄露的信息了。

    注意!重点来了。

    虽然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);  

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

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

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

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

  • 相关阅读:
    Windows平台下MySQL常用操作与命令
    button和sumbit提交表单的区别
    AjaxPro.Net的使用
    小写金额转换成大写
    sqlserver自动定时备份数据库并按日期命名
    dw文档的当前编码不能正确保存文档所有字符.....
    windows 2003 ii6 上运行asp出现http500错误
    图片提示预览效果
    一个网站优化seo的年终工作总结
    很COOL的相册
  • 原文地址:https://www.cnblogs.com/mysunnyday/p/2082723.html
Copyright © 2020-2023  润新知