程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> C++內存洩漏檢測拾遺

C++內存洩漏檢測拾遺

編輯:關於VC++

在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. 下一頁:
Copyright © 程式師世界 All Rights Reserved