避免記憶體錯誤(C )

2022-05-14 03:35:22 字數 1729 閱讀 4491

記憶體管理上的錯誤是c/c++程式設計是最為可怕的錯誤之一,這類錯誤不易除錯查詢,有時候是你程式關閉的時候才出現,如果你面對的是乙個大型工程,那就相當令人頭疼了,下面將該類錯誤出現的原因總結為如下四點:

記憶體洩露

顧名思義,記憶體洩露是指分配了一段記憶體之後,沒有將其釋放所致,這塊沒有釋放而又沒用的記憶體會隨同程式執行一直存在。如果程式一味地分配記憶體而不予**,可以想象,系統資源會很快耗盡,程式乃至於系統執行越來越慢,因此,必須杜絕這種現象發生。當然了,有人說我自己申請的記憶體肯定都會釋放啊。那就請看下面的例子吧:

void memory_leak()

在上述例子中,函式也執行了記憶體釋放啊,但是再看,如果程式滿足end()條件,那麼它就會在中途退出,記憶體就不會被釋放。異常、錯誤和其他各種throw和catch語句經常是導致記憶體洩露的原因。

還有一種可能引起記憶體洩露的原因時忘記了釋放乙個資料結構的某些部分。例如:

typedef struct student;

對於student這個結構有這樣乙個函式如下:

void memory_leak()

在上面的例子中,乙個student結構體被分配了記憶體並在函式結束的時候釋放,但是這個結構體的一些域並沒有被釋放,例如name以及address,注意:結構體被釋放並不表示他的域也被釋放了。

重複釋放

記憶體分配與釋放應該是一一對應的,如果釋放乙個根本不存在的指標,或重複釋放都會引起麻煩,這時可以寫如下乙個巨集來避免該內錯誤:

#define safe_delete(p)

}下面介紹一下可能重複釋放的小例子吧:

void twice_free(x)

void main()

上面的例子比較明顯,在此就不多講了,還有一種情況就是多個指標指向同一塊記憶體,然後依次釋放各個指標:

byte *p_buffer1 = new byte[100];

…byte *p_buffer2 = p_buffer1;

….delete p_buffer1;

delete p_buffer2;

如果繼續繼續使用乙個已經釋放了的指標也將會出現嚴重問題:

void twice_free(x)

void main()

壞指標問題

壞指標是一類問題的總稱,他可能由多種原因引起,如乙個指標沒有指到預期位置,程式可能毫無徵兆的崩潰,壞指標是從哪兒來的?

乙個不可忽視的根源就是沒有被很好的初始化的資料。所以乙個指標你不知道合適的初始化值,就將其初始化為null吧,這是乙個無效位址。

超量寫記憶體

比如說訪問陣列越界啊什麼的,分配記憶體不不足啊,例如:

#define array_size 100

int *a = (int *)malloc(array_size)    //應為int *a = (int *)malloc(array_size * sizeof(int))

a[99] = 0;

還有就是字串的最後沒有結束符'\0',當然,現在都使用string,cstring資料型別,這個問題就比較少了哈。

還有函式返回乙個臨時變數指標也會出錯,如:

int *p()

總之,c/c++程式中這類錯誤指標的情況是非常常見的,情況也比較多,而且十分隱蔽,很難被發現。最好的途徑就是養成良好的程式設計習慣,已盡量避免他們的發生。

(源於《c++資料結構原理與經典問題求解》一書)

C 記憶體常見錯誤

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

定位C程式記憶體錯誤

這些資訊是 ubuntu 7.10 gcc 4.1.3,gdb 6.6 debian 跟蹤的 當printf不夠有效時。1。讀懂錯誤資訊 乙個簡單的例子 include include void a intmain intargc,char argv 除錯的時候,b sighandler,然後bt....

C 常見記憶體錯誤彙總

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