一、前言
在用C語言開發產品時,由於C語言中的指標操作的靈活性,因此在使用指標時也需要特別小心,稍微不嚴謹就會導致記憶體問題,如記憶體未初始化,記憶體泄露,記憶體重複釋放等。但是在實際開發中,使用指標是不可避免的,那麼出現記憶體問題也是不可避免的,因為不可能每個人都會仔細的敲代碼並審查代碼;那麼如果出現這些問題時,有什麼彌補手段了?這時候在項目開發中,使用記憶體檢測模組就非常有必要了。
二、基本原理
要使用一塊新記憶體,要麼從棧上分配,要麼從堆上分配,如果是從堆上分配,那麼就記錄申請好的記憶體起始地址,分配的大小,檔案名稱和行號(哪個檔案的哪一行調用了分配函數),如果是釋放堆上的記憶體,同樣記錄釋放的地址,檔案名稱和行號(哪個檔案的哪一行調用了釋放函數),這樣對所有的分配和釋放操作進行記錄的話,就可以解決一些記憶體操作問題,
如記憶體泄露,記憶體重複釋放等;大體結構如所示:
三、應用開發
C語言中的記憶體申請函數為malloc,記憶體釋放函數為free,如果我們在產品開發中直接使用這兩個函數,那麼又怎麼會得到檔案名稱和行號了?因此需要對malloc和free函數進行封裝,
使用宏進行封裝,如
#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來釋放記憶體。
四、記憶體操作注意事項
我在這裡寫了C語言開發中的指標操作注意釋放,希望與大家一起學習:
1、申請一段記憶體後,應對該記憶體記憶體進行初始化,如調用memset進行清零操作
2、申請記憶體後,在進行操作之前,應對申請後的指標進行空值判斷
3、釋放指標後,該指標必須賦值為NULL,當然賦值操作這個操作在my_free函數中進行,所以my_free函數的參數為二級指標
4、盡量堅持誰申請誰釋放的規則,如果不是,則群組成員應該協商或者代碼加註釋說明
五、備忘
關於記憶體覆蓋和記憶體訪問越界,一直找不到好的方法檢測。。鬱悶中。。