基於C++中常見記憶體錯誤的總結

來源:互聯網
上載者:User

在系統開發過程中出現的bug相對而言是比較好解決的,花費在這個上面的調試代價不是很大,但是在系統整合後的bug往往是難以定位的bug(最好方式是打樁,通過打樁可以初步鎖定出錯的位置,如:進入函數前列印日誌,離開時再次列印日誌)。而這些難以定位的bug基本分為2類:記憶體錯誤和並非問題。

1、記憶體泄露
如果在堆棧上分配的記憶體使用量完成後沒有釋放就會造成記憶體泄露。少量的記憶體泄露不至於讓程式崩潰,但是大量的記憶體泄露就會導致記憶體耗盡,後續記憶體配置失敗,從而導致程式崩潰。長時間運行軟體,即使只有一兩處泄露,同樣會導致程式崩潰。所以有當出現記憶體泄露請檢查是否釋放了資源。

2、記憶體越界訪問
記憶體越界訪問有兩種:一種是讀越界,即讀了不屬於自己的資料,如果所讀的記憶體位址是無效的,程式就立即崩潰。如果所讀的記憶體位址是有效,在讀的時候不會出現問題,但是由於讀到的資料是隨機的,他會產生不可預料的後果,另一種是寫越界,又叫緩衝區溢位。所寫的資料是隨機的,他也會產生不可預料的後果。

記憶體越界訪問造成的後果非常嚴重,是引起程式不穩定的主要原因之一,最主要的是它造成的後果是隨機的,表現出來的癥狀和時機也是隨機的,讓bug的現象和本質看似沒有什麼聯絡,這給bug定位帶來了極大的困難。所以在時機開發過程中,對於外部傳入的參數要仔細檢查。

3、野指標
釋放掉的記憶體會被記憶體管理器重新分配。此時野指標指向的記憶體已經被賦予新的意義。對野指標指向的記憶體訪問,無論是有意的還是無意的,都會為此付出巨大代價,因為它造成的後果,如果越界訪問一樣是不可預料的。解決野指標最好的方法:釋放記憶體後立即把對應指標置為空白值。

4、訪問null 指標
在訪問指標指向的記憶體時,確保指標不是null 指標。訪問null 指標指向的記憶體,通常會導致程式崩潰,或者不可預料的錯誤。

5、引用未初始化的變數
未初始設定變數的內容是隨機的,使用這些資料會造成不可預料的後果,調試這樣的bug也非常困難。最好的解決辦法:在聲明變數的時候就對它進行初始化。

6、不清楚的指標運算
如:int *p=....;
p+n等價於(size_t)p+n*sizeof(*p);

7、結構體成員順序變化引發的錯誤

8、結構體大小變化引發的錯誤

9、分配釋放不配對

10、返回指向臨時變數的指標
棧裡面的變數時臨時的,當前函數執行完成時,先關的臨時變數和參數都被清除了。不能把指向這些臨時變數的指標返回給調用這,這樣的指標執行的資料是隨機的,會給程式造成不可預料的後果。

11、試圖修改常量
如:char *p="1234";
*p='1';

12、誤解傳值和傳引用

13、重名符號
關於重名問題可以參考:C++重定義解決方案總結

14、棧溢出

15、誤用sizeof
C++通常是按值傳遞參數,而數組則是例外,在傳遞數組參數時,數組退化為指標(及按引用傳遞),此時用sizeof是無法擷取資料的大小。

16、位元組對齊
位元組對齊主要目的是提高記憶體訪問效率,在某些平台上,就不僅僅是效率問題,如果不對齊得到的資料是錯誤的。大多數情況下編譯器會保值全域變數和臨時變數按照正確的方式對齊。記憶體管理器會保證動態按照正確的方式對齊。要注意的是:在不同的類型的變數之間轉換時要小心。
位元組對齊也會造成結構體大小的變化,在程式內部用sizeof來取的結構的大小就可以了。若資料要在不同的機器間傳遞時,在通訊協定中要規定對齊的方式,避免對齊不一致引發的問題。
關於位元組對齊問題請參考:關於C++記憶體中位元組對齊問題的詳細介紹

17、位元組順序
位元組順序曆來是設計跨平台最頭痛的問題。位元組順序是關於資料在實體記憶體中的布局問題,最常見的位元組順序有兩種:大端模式和小端模式
大端模式:高位位元組資料存放在低地址處,低位位元組資料存放在高地址處。
小端模式:低位位元組資料存放在記憶體低地址處,高位元組位元組資料存放在記憶體高地址處

如:long n=0x11223344
模式第1位元組 第2位元組第3位元組 第4位元組
大端模式0x110x220x330x44
小端模式0x440x330x220x11

在普通軟體中,位元組順序問題並不引人注目。而在開發與網路通訊和資料交換有關的軟體時,位元組順序就要多注意了。

18、多線程共用變數沒有用valotile修飾
valotile作用:告訴編譯器不要把變數最佳化到寄存器中。在開發多線程的程式是,如果這些線程共用一些全域變數,這些全域變數最好使用valotile修飾。這樣可以避免因為編譯器最佳化而引起的錯誤。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.