C++内存泄漏检测

C++内存泄漏检测

在MFC开发环境中,当运行退出了,Visual Studio会在输出窗口提示是否有内存泄漏。也可以借助MFC类CMemoryState动态地检测并输出内存泄漏信息。

在非MFC框架中,需要借助CRT函数实现这些功能。

1. 调用_CrtDumpMemoryLeaks()函数会在输出窗口中输出当前的内存泄漏。若在程序开始处加上:_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

语句,CRT会在程序的每个出口处自动调用_CrtDumpMemoryLeaks函数,因此程序终止时会在输出窗口显示所有的内存泄漏。

2.利用_CrtMemState结构定点监测内存泄漏,例:

  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函数在输出到指定目的地之前拦截消息。如:

_CrtSetReportHook( MyReportingFunction );

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

转载于:https://my.oschina.net/u/245046/blog/102320

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值