在MFC開發環境中,當運行退出了,Visual Studio會在輸出窗口提示是否有內存泄漏。也能夠藉助MFC類CMemoryState動態地檢測並輸出內存泄漏信息。 框架 在非MFC框架中,須要藉助CRT函數實現這些功能。 函數 1. 調用_CrtDumpMemoryLeaks()函數會在輸出窗口中輸出當前的內存泄漏。若在程序開始處加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); spa 語句,CRT會在程序的每一個出口處自動調用_CrtDumpMemoryLeaks函數,所以程序終止時會在輸出窗口顯示全部的內存泄漏。 內存 2.利用_CrtMemState結構定點監測內存泄漏,例: ci
- //定義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函數在輸出到指定目的地以前攔截消息。如: io _CrtSetReportHook( MyReportingFunction ); table MyReportingFunction 的定義以下: 內存泄漏
- int MyReportingFunction( int nReportType, char *szMsg, int *pRetVal )
- {
- *pRetVal = 0;
- if( nReportType == _CRT_WARN )
- {
- AtlMessageBox( NULL, _U_STRINGorID( CA2T(szMsg)));
- }
- return 0;
- }
複製代碼
|