在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;
- }
复制代码
|