C 記憶體洩漏的常規問題和解決辦法

2021-09-24 09:25:18 字數 1732 閱讀 7819

問題:c++記憶體洩漏:

原因: 記憶體錯誤和並非問題。

1,記憶體洩漏:堆疊記憶體沒有釋放,(少量一般無事);(大量記憶體洩漏)導致記憶體耗盡,後續分配記憶體失敗,程式奔潰。(少量記憶體洩漏),程式執行時間長久,也容易奔潰。

2,記憶體越界訪問:(1)讀越界,讀取不是自己的資料。讀取位址無效,程式直接奔潰。讀取位址有效,但是資料是隨機的,雖然讀取成功,但是會發生不可以預料的後果。(2)寫越界,或者可以叫做快取區溢位,因為所寫的資料隨機,所以後果未知。

3,野指標:釋放掉的記憶體會被記憶體管理器重新分配記憶體。此時它(野指標)指向的記憶體已經被賦予了新的意義。對野指標指向的記憶體訪問,同樣會發生不可預知的後果。解決野指標最好的方法:釋放記憶體後立即把對應指標置為空值。

4,空指標:訪問空指標指向的記憶體,一般會導致程式奔潰,或者未知的後果。所以在訪問指標指向的記憶體時,一定要保證指標不是空指標。

5,引用未初始化的變數:未初始化變數的內容是隨機的,使用這些資料會造成未知的後果。最好的解決辦法:在宣告變數的時候就對它進行初始化。

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修飾。這樣可以避免因為編譯器優化而引起的錯誤。

記憶體洩漏的場景和解決辦法

1.非靜態內部類的靜態例項 非靜態內部類會持有外部類的引用,如果非靜態內部類的例項是靜態的,就會長期的維持著外部類的引用,組織被系統 解決辦法是使用靜態內部類 2.多執行緒相關的匿名內部類和非靜態內部類 3.handler記憶體洩漏 handler導致的記憶體洩漏也可以被歸納為非靜態內部類導致的,h...

多執行緒記憶體洩漏 記憶體洩漏的場景和解決辦法

1.非靜態內部類會持有外部類的引用,如果非靜態內部類的例項是靜態的,就會長期的維持著外部類的引用,組織被系統 解決辦法是使用靜態內部類 2.多執行緒相關的匿名內部類和非靜態內部類 3.handler記憶體洩漏 handler導致的記憶體洩漏也可以被歸納為非靜態內部類導致的,handler內部mess...

記憶體洩漏 及 記憶體溢位的區別和解決辦法

1 記憶體洩漏memory leak 是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。2 記憶體溢位 out of memory 指程式申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,給了你一塊儲存int型別資料的儲存...