windows 下面的內存泄漏排查.
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
內存泄漏排查
一下本人只是簡單的介紹一個實用, 如果讀者很感興趣, 可以查閱msdn自己去深入調查相關的API和原理.
API 介紹
1. 馬上打印泄漏信息:_CrtDumpMemoryLeaks();
一般用于局部跟蹤內存泄漏問題,使用的方法很簡單,你懷疑在某一個時刻有內存泄漏了,就執行這個函數調用,然后在 vs 調試器的 "output" 窗口會馬上會打印出當前所有沒有釋放的內存的申請明細(包括文件名,行號, 第幾次內存分配)。
雙擊就可以定位到源文件 內存申請的地方, 很方便.
2. 程序結束之前打印泄漏信息: 一般用于全局的內存泄漏問題,在程序剛開始的時候就可以用起來。 使用方法也很簡單,執行下面兩個語句, 先初始化, 然后設置在第幾次的內存分配停住.
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetBreakAlloc(long); // 設置在第幾次內存分配的時候程序暫停執行,并回復現場
環境的設置 1. 每一個MFC生成的類都會有下面的語句 #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #define DEBUG_NEW new(THIS_FILE, __LINE__) #define new DEBUG_NEW #endif 有了這些定義打印泄漏信息的時候就能準備的定位到文件名和行號,雙擊就能定位過去。
2. 非MFC也可以利用現有的VC庫來實現這個功能,同樣是在new上面花功夫,如下: #ifdef _DEBUG #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif 有了這幾行代碼,功能上面和MFC就一樣了。
3. 獲得具體導致內存泄漏的那一份內存分配操作的現場。 獲得的靜態信息里面,在文件名和行號后面還有一個數字,就是代表具體第幾次內存分配 (這里是197)。 所以,我們調用_CrtSetBreakAlloc(197);程序就會在這一次內存分配的時候停下來,這樣我們就獲得了現場。 Detected memory leaks! Dumping objects -> d:\src-project\basictest - 副本\basictest\main.cpp(48) : {197} normal block at 0x002D9488, 128 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
樣例代碼:
from:http://blog.chinaunix.net/uid-22283027-id-3404621.htmlRFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
2. 程序結束之前打印泄漏信息: 一般用于全局的內存泄漏問題,在程序剛開始的時候就可以用起來。 使用方法也很簡單,執行下面兩個語句, 先初始化, 然后設置在第幾次的內存分配停住.
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); _CrtSetBreakAlloc(long); // 設置在第幾次內存分配的時候程序暫停執行,并回復現場
環境的設置 1. 每一個MFC生成的類都會有下面的語句 #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[] = __FILE__; #define DEBUG_NEW new(THIS_FILE, __LINE__) #define new DEBUG_NEW #endif 有了這些定義打印泄漏信息的時候就能準備的定位到文件名和行號,雙擊就能定位過去。
2. 非MFC也可以利用現有的VC庫來實現這個功能,同樣是在new上面花功夫,如下: #ifdef _DEBUG #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif 有了這幾行代碼,功能上面和MFC就一樣了。
3. 獲得具體導致內存泄漏的那一份內存分配操作的現場。 獲得的靜態信息里面,在文件名和行號后面還有一個數字,就是代表具體第幾次內存分配 (這里是197)。 所以,我們調用_CrtSetBreakAlloc(197);程序就會在這一次內存分配的時候停下來,這樣我們就獲得了現場。 Detected memory leaks! Dumping objects -> d:\src-project\basictest - 副本\basictest\main.cpp(48) : {197} normal block at 0x002D9488, 128 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
樣例代碼:
- #ifdef _DEBUG
- #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) // 方便調試輸出文件行號信息
- #endif
- void MemoryTest() {
- _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); // 全局設置, 程序退出的時候可以看見內存泄漏.
- _CrtSetBreakAlloc(55); // 第55次內存分配的時候停止.
- int *p = new int(10); // 分配內存
- _CrtDumpMemoryLeaks(); // 檢查當前有哪些內存沒有釋放.
- }
from:http://blog.chinaunix.net/uid-22283027-id-3404621.htmlRFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成