zoukankan      html  css  js  c++  java
  • C++内存泄漏检测拾遗

    在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息.

    在非MFC框架中,需要借助CRT函数实现这些功能.

    1. 调用_CrtDumpMemoryLeaks()函数会在输出窗口中输出当前的内存泄漏.若在程序开始处加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

        语句,CRT会在程序的每个出口处自动调用_CrtDumpMemoryLeaks函数,因此程序终止时会在输出窗口显示所有的内存泄漏.

    2.利用_CrtMemState结构定点监测内存泄漏,例:

            //定义3个内存状态
            _CrtMemState s1,s2,s3;
            
            
    //记录开始的内存状态
            _CrtMemCheckpoint( &s1 );

            
    int  *= new int;

            
    //记录结束时的内存状态
            _CrtMemCheckpoint( &s2 );
            
            
    //比较2个内存状态,并将差异保存到s3中
            if( _CrtMemDifference( &s3, &s1, &s2 ) )
            {
                
    //输出内存泄漏信息
                _CrtMemDumpAllObjectsSince( &s3 );
            }
    3. 重定向输出信息.内存泄漏提示默认是输出在输出窗口中,可以通过_CrtSetReportMode重定向其输出位置.例(重定向输出到指定文件):
            CAtlFile  hFile;
            hFile.Create( _T(
    "D:\\report.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, CREATE_ALWAYS );
            _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
            _CrtSetReportFile( _CRT_WARN, hFile );

    此外还可以重定向为窗体提示(带有"终止"、"继续"、"忽略"按钮的窗体),断言就是输出为此窗体.还可以通过_CrtSetReportHook函数在输出到指定目的地之前拦截消息.如:

    _CrtSetReportHook( MyReportingFunction );

    MyReportingFunction 的定义如下:

    int MyReportingFunction( int nReportType, char *szMsg, int *pRetVal )
    {
        
    *pRetVal = 0;
        
    if( nReportType == _CRT_WARN )
        {
            AtlMessageBox( NULL, _U_STRINGorID( CA2T(szMsg)));
        }
        
    return 0;
    }
  • 相关阅读:
    Vmware Tools的安装与共享文件夹
    2.4 运行JSOP
    2.3 接口fit
    查看与修改主机名
    2.2 接口usr
    vue-router 在微信浏览器中操作history URl未改变的解决方案
    vue使用axios发送请求,都会发送两次请求
    axios对请求各种异常情况处理的封装
    axios设置请求头内容
    vue中的axios.post使用json数据传输,出现请求头字段内容类型是不被允许的情况的解决方案
  • 原文地址:https://www.cnblogs.com/fangkm/p/1515782.html
Copyright © 2011-2022 走看看