由於VC編譯的程式對指標不做越界檢查、申請的記憶體需要自己手動釋放,所以在平時的編程工作中稍有疏忽就會引起指標訪問越界、記憶體流失,這些情況有時候會被Windows報告非法的記憶體訪問,有時候則根本就不會有任何提示,成為程式的一個隱患,隨著已耗用時間的推移,隱患積累過多就會影響程式的穩定和運行結果的正確性。而VC的調試工具好像對指標、記憶體配置並不太操心,很多時候是置之不理,所以用VC編程往往是程式員自己保證程式的正確性,依賴編譯器來尋找執行階段錯誤的情況並不是太多。
幸運的是,有辦法來彌補編譯器不關心的這些事情。今日我就發現了一款軟體BoundsChecker,可以協助程式員及時發現記憶體錯誤。它既是一個獨立的軟體,又可以看做是VC的外掛程式,因為要使用它根本不需要獨立運行它,安裝好之後在VC介面下自動就會增加相應的按鈕來使用BoundsChecker的功能。
BoundsChecker採用一種被稱為 Code Injection的技術,來截獲如分配記憶體、釋放記憶體、指標、數組訪問 之類的代碼。簡單地說,當你的程式開始運行時,BoundsChecker的DLL被自動載入進程的地址空間,然後它會修改進程中對記憶體配置和釋放等等的函數調用或代碼片斷,讓這些調用首先轉入它的代碼,然後再執行原來的代碼,這個過程中它就可以記錄到底申請了多少記憶體、釋放了多少記憶體、訪問是否越界等等,這筆帳它算得一清二楚。BoundsChecker在做這些動作的時,無須修改被偵錯工具的原始碼或工程設定檔,這使得使用它非常的簡便、直接。
使用非常簡單,只需兩步。
1、安裝完BoundsChecker之後,用VC開啟你原來的代碼,就會發現VC工具列上多了一排BoundsChecker的按鈕。點擊[Rebuild all files with BoundsChecker]或者[Build changed files with BoundsChecker],編譯器,當然編譯設定必須打到“Debug”狀態。
2、按"F5",執行程式。注意:必須使用Debug->Go(F5)這個命令,如果用Executes命令,是不會使BoundsChecker起作用的。
接下來就是使用你的程式,盡量折騰出問題來,這樣BoundsChecker就會馬上蹦出來報告的。如果嫌煩,可以設定為不立即報告錯誤,等到程式結束後察看BoundsChecker產生的錯誤清單就可以。簡單的使用就是這樣,更深層次的使用,留待日後發掘了。
後記:寫程式不能光靠自己的小心謹慎,還得藉助必要的工具才行哦,我的一個自認為寫的比較嚴謹的程式,用BoundsChecker拿來一調試,還真發現了兩個錯誤,一個是記憶體流失,new之後忘了delete,另一處是指標越界。