C++內存泄漏檢測

C++內存泄漏檢測

在MFC開發環境中,當運行退出了,Visual Studio會在輸出窗口提示是否有內存泄漏。也能夠藉助MFC類CMemoryState動態地檢測並輸出內存泄漏信息。 框架

在非MFC框架中,須要藉助CRT函數實現這些功能。 函數

1. 調用_CrtDumpMemoryLeaks()函數會在輸出窗口中輸出當前的內存泄漏。若在程序開始處加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); spa

語句,CRT會在程序的每一個出口處自動調用_CrtDumpMemoryLeaks函數,所以程序終止時會在輸出窗口顯示全部的內存泄漏。 內存

2.利用_CrtMemState結構定點監測內存泄漏,例: ci

  1.  //定義3個內存狀態
  2.         _CrtMemState s1,s2,s3;
  3.         //記錄開始的內存狀態
  4.         _CrtMemCheckpoint( &s1 );
  5.         int  *p = new int;
  6.         //記錄結束時的內存狀態
  7.         _CrtMemCheckpoint( &s2 );
  8.         //比較2個內存狀態,並將差別保存到s3中
  9.         if( _CrtMemDifference( &s3, &s1, &s2 ) )
  10.         {
  11.             //輸出內存泄漏信息
  12.             _CrtMemDumpAllObjectsSince( &s3 );
  13.         }
複製代碼

3. 重定向輸出信息。內存泄漏提示默認是輸出在輸出窗口中,能夠經過_CrtSetReportMode重定向其輸出位置。例(重定向輸出到指定文件): 開發

  1.   CAtlFile  hFile;
  2.         hFile.Create( _T("D:\\report.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, CREATE_ALWAYS );
  3.         _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
  4.         _CrtSetReportFile( _CRT_WARN, hFile );
複製代碼

此外還能夠重定向爲窗體提示(帶有"終止"、"繼續"、"忽略"按鈕的窗體),斷言就是輸出爲此窗體。還能夠經過_CrtSetReportHook函數在輸出到指定目的地以前攔截消息。如: io

_CrtSetReportHook( MyReportingFunction ); table

MyReportingFunction 的定義以下: 內存泄漏

  1.  int MyReportingFunction( int nReportType, char *szMsg, int *pRetVal )
  2. {
  3.     *pRetVal = 0;
  4.     if( nReportType == _CRT_WARN )
  5.     {
  6.         AtlMessageBox( NULL, _U_STRINGorID( CA2T(szMsg)));
  7.     }
  8.     return 0;
  9. }
複製代碼
相關文章
相關標籤/搜索