当前位置:主页   - 电脑 - 程序设计 - C/C++
C++内存泄漏检测拾遗
来源:网络   作者:   更新时间:2012-02-16
收藏此页】    【字号    】    【打印】    【关闭

  在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  *p = 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;
}

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明