新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > C++內存泄漏檢測拾遺

        C++內存泄漏檢測拾遺

        作者: 時間:2011-05-29 來源:網絡 收藏

        在MFC開發環境中,當運行退出了,Visual Studio會在輸出窗口提示是否有。也可以借助MFC類CMemoryState動態地并輸出信息。

        本文引用地址:http://www.104case.com/article/150684.htm

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

          }



        關鍵詞: 拾遺 檢測 泄漏 內存

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乐业县| 沁水县| 文水县| 彰武县| 鹰潭市| 亚东县| 南华县| 彰化市| 南岸区| 彭山县| 大埔区| 红河县| 西安市| 汉中市| 岑巩县| 仲巴县| 柳江县| 南召县| 德兴市| 全南县| 林口县| 河间市| 斗六市| 神农架林区| 醴陵市| 江阴市| 大理市| 从化市| 光泽县| 巴马| 太湖县| 镇康县| 溧阳市| 石屏县| 固安县| 招远市| 冷水江市| 宝坻区| 井陉县| 正镶白旗| 永安市|