C語言開發中的內存檢測基本模塊

1、前言

在用C語言開發產品時,因爲C語言中的指針操做的靈活性,所以在使用指針時也須要特別當心,稍微不嚴謹就會致使內存問題,如內存未初始化,內存泄露,內存重複釋放等。iphone

可是在實際開發中,使用指針是不可避免的,那麼出現內存問題也是不可避免的,由於不可能每一個人都會仔細的敲代碼並審查代碼;那麼若是出現這些問題時,有什麼彌補手段了?函數

這時候在項目開發中,使用內存檢測模塊就很是有必要了。post

2、基本原理

要使用一塊新內存,要麼從棧上分配,要麼從堆上分配,若是是從堆上分配,那麼就記錄申請好的內存起始地址,分配的大小,文件名和行號(哪一個文件的哪一行調用了分配函數),學習

若是是釋放堆上的內存,一樣記錄釋放的地址,文件名和行號(哪一個文件的哪一行調用了釋放函數),這樣對全部的分配和釋放操做進行記錄的話,就能夠解決一些內存操做問題,指針

如內存泄露,內存重複釋放等;大致結構以下圖所示:商帳追收code

3、應用開發

C語言中的內存申請函數爲malloc,內存釋放函數爲free,若是咱們在產品開發中直接使用這兩個函數,那麼又怎麼會獲得文件名和行號了?所以須要對malloc和free函數進行封裝,blog

使用宏進行封裝,如ip

#define DAWEN_MALLOC(_size) my_malloc(_size,__FILE__,__LINE__) 內存

#define DAWEN_FREE(_pointer) my_free(_pointer,__FILE__,__LINE__)開發

其中__FILE__,__LINE__宏爲系統自定義的宏,表示當前代碼運行處的文件名和行號,而後,在my_malloc函數中使用malloc系統函數,在my_free函數中使用free系統

函數,這樣就能夠記錄一些信息了。因此在開發時,一概使用my_malloc來申請內存,使用my_free來釋放內存。

4、內存操做注意事項

我在這裏寫了C語言開發中的指針操做注意釋放,但願與你們一塊兒學習:

一、申請一段內存後,應對該內存內存進行初始化,如調用memset進行清零操做

二、申請內存後,在進行操做以前,應對申請後的指針進行空值判斷

三、釋放指針後,該指針必須賦值爲NULL,固然賦值操做這個操做在my_free函數中進行,因此my_free函數的參數爲二級指針

四、儘可能堅持誰申請誰釋放的規則,若是不是,則組成員應該協商或者代碼加註釋說明iphone5

5、備註

關於內存覆蓋和內存訪問越界,一直找不到好的方法檢測。。鬱悶中。。。。。

相關文章
相關標籤/搜索