在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;
}