如前一篇所講的,我們可以通過調用_CrtDumpMemoryLeaks()這個方法來檢查程式是否存在記憶體流失,之後我又試了一下這個代碼:
1: int _tmain(int argc, _TCHAR* argv[])
2: {
3: int* p = new int;
4: _CrtDumpMemoryLeaks();
5: delete p;
6: return 0;
7: }
它也是會輸出有記憶體流失的資訊,可以得到,每調用一次new,系統內部就會記錄下這個操作,天知道它不是是存放在一個list之類的結構裡面呢!調用一次delete就是從這個結構裡刪除一條記錄,而_CrtDumpMemoryLeaks()方法就是把目前記錄裡的狀態輸出。
但是如果記憶體的釋放是寫在一個類的解構函式裡,我們應該把_CrtDumpMemoryLeaks()寫在那呢?
這會產生: 如果代碼是這樣的怎麼辦呢?在查詢後發現可以這樣寫: 運行後就是: 這樣就正確了!^_^CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );該語句在程式退出時自動調用 _CrtDumpMemoryLeaks。必須同時設定 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF.好了,我還想讓這個提示資訊再明顯一些,輸出在Output裡面,會有幾個人看呢?我們先寫這樣一個方法: 然後通過atexit方法將這個方法註冊為退出函數: 運行效果如下:
最終,我們可以寫一個公用的函數如下:
1: void CheckOnExit()
2: {
3: _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
4: int mCount = _CrtDumpMemoryLeaks();
5: assert( mCount == 0);
6: }
然後我們就可以容易的找到代碼記憶體流失的地方。