折磨了我n多天的記憶體洩露bug終於解決了,當發現原因竟然是自己犯的那樣弱智的乙個錯誤時,真有種撞牆的衝動。現在就說說這次除錯過程,血的教訓!!以後寫**務必務必謹慎!!
程式寫好了,拿兩個資料檔案做測試,除錯通過,輸出正常,ok~,然後就想測試一下所有的資料檔案,看看結果是不是理想。寫了乙個批處理檔案來遍歷執行所有的檔案,然後問題就出現了,大部分檔案執行都是正常的,但執行到有些檔案時,windows就會報錯,只能跳過執行下乙個檔案。這就奇怪了,為什麼會這樣呢,這些檔案都是符合iso要求的模板,檔案結構都一樣,怎麼有些就出錯呢,難道是這些檔案的資料量大,超出了變數的定義範圍嗎?
f10單步執行看看到底是哪句話出問題了,發現每次報錯都是在乙個類成員函式處,詭異的是這個成員函式在程式中被呼叫了兩次,第一次是沒有問題的,總是到第二次呼叫的時候報錯。難道是這次呼叫的時候引數不同所致嗎,按f11進去,一步一步的走,一直走到最後都沒問題,在函式返回的時候又報錯了,這會不會是引數返回時出問題了,檢查了幾遍之後發現引數返回,區域性指標變數等都沒問題。所以不管怎麼加斷點,單步跟程式,始終找不到問題出在哪。各種論壇上對這個問題的解釋眾說紛紜,反正歸根結底一句話,這個跟自己具體的**有關,沒有統一的答案。當時就鑽進死角了,就認為問題出在那個函式,但不管怎麼折騰,錯誤依然存在。
這時在網上看到一種定位記憶體洩露的方法,這裡推薦兩篇文章 ;我就在程式的main函式所在的cpp檔案中新增了這樣一段**
#define _crtdbg_map_alloc
#include
#include
#ifdef _debug
//#define new debug_new
#define new new(_client_block,__file__,__line__) //注意,這裡是__ 不是_
#endif
inline void enablememleakcheck()
在main函式中新增:
enablememleakcheck();
在其他的cpp檔案中新增**:
#ifdef _debug
//#define new debug_new
#define new new(_normal_block,__file__,__line__)
#endif
這樣除錯的時候就能看到記憶體洩露的new所在的位置,雙擊除錯視窗的相應行,就定位到出錯的位置,當我看到指向的位置時,又一次崩潰了,這個new在乙個迴圈裡,這個迴圈在乙個類私有成員函式中,這個函式在程式中呼叫了n多次(n很大很大),我可判斷不出來是那次呼叫出問題了。。。
心灰意冷地跟乙個大牛聊這個問題,他說在記憶體洩露時,用斷點跟蹤這種方法確定的錯誤位置是不靠譜的,vs給出的錯誤位置也是不靠譜的。他說每次他遇到這種情況都是二分法注釋掉一部分程式,然後一步步地縮小範圍。我聽了將信將疑,權且死馬當活馬醫試試看吧。我先注釋掉了出錯的那個函式,結果讓我大跌眼鏡,錯誤果真還在,只是指向了後邊另外乙個函式,當時瞬間有種被欺騙的趕腳,敢情我花了那麼長時間都是被vs玩了呀。然後我就依次注釋掉了後邊所有報錯的函式,問題還是莫名其妙的存在,乾脆我就注釋掉了所有自己新增的**,然後一步步的去掉注釋除錯,終於在新增一行**時程式又報錯了。。當時簡直太興奮了(第一次看到程式崩潰會這麼開心)。然後就看那個函式能有什麼問題。結果。。。問題還真找出來了,,我把乙個陣列的行和列弄反了。。竟然是這麼個弱智的問題困擾了我這麼多天。。。。還走了那麼多彎路。。
現在想想除了寫**不仔細之外,還是自己除錯程式的方法有問題,要是不鑽死角,不自己死磕,多跳出來思考問題,多跟大牛請教,也許就不用浪費這麼長時間了。。
VS2010 檢查記憶體洩露的方法
第一種 define crtdbg map alloc include include crtdumpmemoryleaks 3.output中將會跟蹤所有記憶體建立和銷毀的過程,這些資訊可以忽略。4.程式退出時,output中將會顯示出建立記憶體未釋放的 行資訊。這個可以解決絕大部分情況下出現的記...
VS2010 檢查記憶體洩露的方法
第一種 define crtdbg map alloc include include crtdumpmemoryleaks 3.output中將會跟蹤所有記憶體建立和銷毀的過程,這些資訊可以忽略。4.程式退出時,output中將會顯示出建立記憶體未釋放的 行資訊。這個可以解決絕大部分情況下出現的記...
VS2010 檢查記憶體洩露的方法
第一種 define crtdbg map alloc include include crtdumpmemoryleaks 3.output中將會跟蹤所有記憶體建立和銷毀的過程,這些資訊可以忽略。4.程式退出時,output中將會顯示出建立記憶體未釋放的 行資訊。這個可以解決絕大部分情況下出現的記...