剛剛解決了一個內存泄露的問題,是個疑難問題。在網上找了各種方法都沒有效果。最終找到如下方法:
首先確定自己的程序使用的是哪個C運行庫:
方法是程序Propertise -> C/C++ -> Code Generation -> Runtime Library選項,若爲Multi-threaded Debug(/MTd),則爲靜態鏈接,若爲Multi-threaded Debug DLL(/MDd),則爲動態鏈接。
然後按F11啓動程序,程序會停在入口點。此時調出Watch窗口:
如果是靜態鏈接 在name項中輸入_crtBreakAlloc,在value項中輸入你要定位的內存分配編號;
如果是動態鏈接 在name項中輸入{,,msvcr90d.dll}_crtBreakAlloc,在value項中輸入內存分配號。
注意msvcr90d.dll是vc2008環境使用的運行庫dll,若你用的是其他版本vc,請換成對應版本的dll。
現在按F5運行,程序就會自動定位到你要調試的內存分配語句,這時候看call stack的信息會很有幫助。
該方法適用於程序比較大,內存泄露比較多的情形。這個辦法使用起來非常靈活,只要你確定內存分配號是不變的,就可以方便地爲程序設置斷點了,省去了更新代碼和編譯的麻煩。這個方法幾乎是當前進行內存泄漏調試的最有效方法,如果你發現內存泄漏的分配號是變化的,可以想辦法去掉一些沒有問題的內存申請(多半是界面和多線程涉及到的申請),儘量使有問題的分配固定,就可以用這個方法排錯了。
參考: http://blog.sina.com.cn/s/blog_48f93b530100hnls.html