記憶體溢位的問題

軍說網事發表於2017-08-31

很久沒看程式碼了,也很久沒發表技術博文了。似乎有點掛羊頭賣狗肉的感覺,今天寫一篇關於記憶體溢位的問題,倒不是心理的愧疚,而是確實發生的事情,正好當做一篇博文寫寫。

前幾天去朋友那邊辦點事情,正好他在除錯加密函式,然後他大概除錯了2個小時吧,就問我,奇怪了,怎麼函式執行完了,不返回到main函式呢。我說你除錯一遍我看看,然後還真事,執行到函式最後一行,再執行就異常了。我說這種情況應該是記憶體溢位的問題,記憶體溢位破壞了函式棧,函式執行完了,也不知道返回到哪兒去。然後我讓他列印一些資訊試試,結果看也正常執行了。我說你這樣,你函式從開始就return看看呢。然後這樣找到了出問題的一行程式碼,是呼叫字串轉換成十六進位制函式。也許有人會說,不用這麼麻煩啊,windows程式生成map檔案,一看就知道是在哪行出問題了啊。不好意思,我忘記說了,這事是發生在mac筆記本上。如果是我,我也許也會選擇先在Windows下測試的。言歸正傳,找到了函式哪行出問題了,我說,那你除錯進去看看呢,斷點到函式最後一行,發現果然是記憶體的問題,呼叫的時候申請分配的記憶體是8,最後給17的位置賦值\0。然後回到呼叫的地方,那就知道問題了,字串的長度是8,給十六進位制申請分配的記憶體是8+1,這顯然是不對的,應該是8*2+1。知道問題了,修改了後,測試可以了。然後我那朋友說,這網上找的程式碼不靠譜啊。我說,參考參考還是可以的。也許有的人要說了,怎麼明顯的問題都看不出來,還要測試啊。首先呢,是網上找的程式碼,你是不會也不可能每一行都看的,更不用說看懂了。當然正常的情況是要先看懂,那就看你的boss給不給足夠的時間啦。

解決問題後,我們閒聊,我說最開始接觸這個的時候,聽那些人講,什麼記憶體洩露,記憶體溢位,野指標啥的,完全不知道是什麼玩意。現在其實接觸多了,你實踐與理論結合去分析問題,實踐中理解理論,理論指導實踐,相輔相成。而很多人,可能是不善於表達,又或者是隻知其一不知其二,總喜歡把理論搞的很神祕似的,其實完全沒必要,實踐得真知。能用通俗易懂的言語把理論講明白,而不是照本宣科的講理論的人,那肯定是付出很多實踐總結出來的。這種人值得我們學習。沒有自誇的意思,我還在不斷的學習中,其實很想發技術博文的,總是一些事情要去處理,說這些似乎有些為自己辯解,好吧,我反省。

相關文章