C++程序作為一種計算機語言,具有功能豐富等優點,廣泛應用于工業軟件研發當中,不僅具有很高的開發價值,而且研究價值也很高。
有利就會有弊,其程序同時具有概念復雜的缺點,對于初學者來說經常出現錯誤,令其茫然失措,會使學習的信心受到挫傷。因此加深對常見錯誤的認識與掌握有效的解決方法顯得尤為重要,本文就給大家列舉幾個C++常見錯誤及解決方法。
1、返回值返回錯誤
在項目的生命周期內,錯誤隨時隨地都有可能發生,雖然那些錯誤都在實際運行過程中發生,在設計、編碼和測試階段無法規避但卻是可以預見的,這時候我們就可以通過返回值返回錯誤信息。
請看代碼:
以上代碼中,打開文件失敗是一種常見的可預見性錯誤,當打開一個文件時,如果打開失敗,則后續的操作將無法執行,并會導致程序崩潰。此時可以通過返回錯誤碼的形式通知主調函數發生了錯誤。
2、變量未聲明
由于 C++ 是靜態類型編譯語言,這類型錯誤一般都在編譯階段就會發現,不會帶入到運行時階段,但是這種類型的錯誤客觀存在,并且會增大我們的排錯時間。
出現這種類型的錯誤一般源自兩種情況,一種是從動態語言轉為使用 C++ ,由于習慣問題而直接使用未定義的對象;另一種是由于粗心而寫錯了變量名字,導致編譯器理解為一個新的未聲明的變量。
3、內存訪問越界
內存越界訪問通常發生在數組、字符串或者連續內存的訪問。有兩種情況:
1.寫越界,又叫緩沖區溢出。內存寫越界造成的后果是非常嚴重的。例如訪問數組越界可能會修改訪問數組的循環變量,造成死循環。
2.讀越界,讀了不屬于自己的內存空間。如果所讀的內存地址是無效的,程序會立即崩潰。如果所讀內存地址是有效的,讀入的時候不會有錯誤,但是讀入的數據是隨機的,可能會產生不可控制的后果。
排查內存越界錯誤的方法包括:
1.使用BoundChecker進行調試,BoundChecker在代碼編譯時加入了大量的附加處理,其中包括內存堆棧檢測等,其實ms的 debug模式也做了許多的類似操作,但debug模式下的一些代碼行為,如初始化變量,和Release下的代碼執行不同,所以用debug調試不是完美的方式
2.類內部出現莫名其妙的錯誤時,查看 this 指針是否變化,必要的時候進行手手工檢查
3.在調試的 “查看” 窗口 輸入:@err,hr 看全局錯誤變量的內容
4.注釋掉部分代碼,看是否錯誤還出現,注釋的最佳方式是二分法
5.查看程序異常處的反匯編代碼,分析原因
6.最后的辦法:代碼復查
內存訪問越界不屬于語法錯誤,無法通過編譯器發現,甚至程序運行初期也不會發生錯誤,直到某些特定情況下才會由于內存越界而導致程序崩潰,此時程序已經運行一段時間了。內存越界也無法從根本上避免,只能預防。
4、內存泄露
內存泄露是指應用程序未釋放動態申請的且不再使用的內存,原因可能是程序員疏忽或者錯誤造成程序異常。
在C/C++中,內存管理器不會幫助你自動回收不再使用的內存,不管在什么情況下,采取謹慎的態度,杜絕內存泄露的出現,都是上策。盡管一些工具可以幫助我們檢查內存泄露問題,但是編程時還是應該仔細一點,盡早排除這類錯誤,工具只是用作驗證的手段。
5、函數跳轉處理錯誤
函數跳轉方式主要過程為:先調用函數setjmp,用變量記錄當前主函數被執行到的位置,然后在函數中如果調用了longjmp,程序的執行流程將返回到setjmp記錄的變量所記錄的位置,并使setjmp的返回值為設定的-1。這時,通過判斷返回值,就可以知道所需的操作是否正確完成。
請看代碼:
以上代碼中當打開文件的操作失敗時,該工程接下來的操作將無法進行,因此可以通過函數條轉的方式實現錯誤的通知,為后續進一步操作打好基礎。
軟件編程的過程中,程序員所犯的并不一定是重大錯誤,反而一些常見的錯誤屢見不鮮。這些錯誤嚴重影響到編程中測試和調試的時間。所以,在編程的過程中,要時時提醒自己,告誡自己避免這些錯誤。