• Windows下内存泄漏检测方法


    Windows下内存泄漏检测方法一
    1、在主程序的cpp文件里加上以下三行,顺序一定不能颠倒
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>
    2、在程序退出的时候加上_CrtDumpMemoryLeaks(),如果程序有多个退出的地方,则多个地方要加_CrtDumpMemoryLeaks()比较麻烦,可以在程序的开始处加上_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)
    3、经过实验_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF )和_CrtDumpMemoryLeaks()竟然会发现不一样的内存泄漏
    4、_CrtDumpMemoryLeaks()的返回值表示有几处内存泄漏,如果在程序退出是提示程序员有几处内存泄漏肯定会比在Output里提示强的多。可通过如下方式设置:
    void Exit()
    {
        int i = _CrtDumpMemoryLeaks();
        _ASSERT( i == 0);
    }
    在程序进入后设置atexit(Exit);

    Windows下内存泄漏检测方法二
    MFC程序下默认自带内存泄漏检测工具,在Debug模式下会进行内存泄漏检测,不止是MFC下,在VC环境里都有自带的内存泄漏检测技术,在头文件包含如下语句即可:
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    注意这些语句一定要在include的下面,不然会出现错误,另外要将工程的code generation选择多线程。我们会发现在cpp文件中只对new做了映射,如果你在程序中直接使用malloc函数分配内存,调用malloc的文件名和行号是不会被记录下来的。如果这块内存发生了泄漏,MS C-Runtime Library仍然能检测到,但是当输出这块内存块的信息,不会包含分配它的的文件名和行号。统资源比如HANDLE,GDI Object,或是不通过C-Runtime Library分配的内存,比如VARIANT,BSTR的泄漏,它是无法检测到的,这是这种检测法的一个重大的局限性。

    Windows下内存泄漏检测方法四
    Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具,用户可从http://www.codeproject.com/tools/visualleakdetector.asp下载,该软件以库形式与用户的被测工程一起使用,由于VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)协议对外开源,所以使用VLD是安全的,不必担心版权问题。
    使用VLD:先从网站下载VLD的zip包,当前最高版本是V1.0,解压后得到vld.h、 vldapi.h、vld.lib、vldmt.lib、vldmtdll.lib、dbghelp.dll等文件,把这些所有.h头文件拷贝到VC默认的include目录下,将所有.lib文件拷贝到VC默认的lib目录下,安装工作就完成了。
    使用VLD很简单,只须在包含入口函数的CPP或C文件中把vld.h头文件包含进来即可。该include语句要求放在最前面,如果当前工程定义预编译head文件(如stdafx.h),则放在“#include <stdafx.h>”语句之后就可以了。

  • 相关阅读:
    外卖 CPS
    拼多多虚拟产品搬砖玩法
    搞笑表情包
    读书
    抖音跑步赚钱
    bootstrapTable固定表头,表头错位问题
    关闭离开页面浏览器提示"确实要离开吗"
    子页面如何调用/关闭父页面layer
    BootstrapValidator 解决多属性被同时校验问题
    使用备份文件新建数据库Web框架
  • 原文地址:https://www.cnblogs.com/zjp8023/p/3121295.html
Copyright © 2020-2023  润新知