C++代碼中的記憶體流失檢查如何做?(二)

來源:互聯網
上載者:User

如前一篇所講的,我們可以通過調用_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: }

然後我們就可以容易的找到代碼記憶體流失的地方。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.