使用Memcheck發現常見的內存問題

1、使用未初始化的內存

全局變量和靜態變量的初始值均爲0,而局部變量和動態申請的變量,其初始值爲隨機值。若是程序使用了隨機值的變量,那麼程序的行爲就變得不可預期。 數組

輸出結果會顯示:Conditional jump or move depends on uninitialized value(s) 即程序的跳轉依賴於一個未初始化的變量。 函數

例: 測試

測試結果: spa


2、內存讀寫越界

當訪問了不應訪問或者沒有權限訪問的內存地址空間,好比訪問數組時越界;對動態內存訪問時超出了申請的內存大小範圍。 內存

輸出結果會顯示: Invalid write of size 4; Invalid read of size 4 it


例: 內存管理

測試結果: io

3、內存覆蓋

使用C標準庫中的strcpy strncpy memcpy strcat時,須要設置源地址(src)和目標地址(dst)srcdst所指向的地址不能發生重疊,不然結果將不可預期。 編譯

輸出結果會顯示:Source and destination overlap in strncpy(dst地址,src地址,地址相差長度) 變量

四、動態內存管理錯誤

全局變量屬於靜態存儲,它們是在編譯時就被分配了存儲空間,函數內的局部變量屬於棧上分配,而最靈活的內存使用方式當屬堆上分配,也叫作內存動態分配了。經常使用的內存動態分配函數包括:malloc, alloc, realloc, new等,動態釋放函數包括free, delete。用 malloc/alloc/realloc 方式申請的內存,用 free 釋放;用 new 方式申請的內存用 delete 釋放。

當申請與釋放不一致時,即相似於用malloc申請卻用delete釋放顯示輸出結果以下:

Mismatched free() /delete/delete[]

當申請與釋放不匹配時,即申請了多少內存卻沒有釋放完或者多釋放了,顯示輸出結果以下:

Invalid free() /delete/delete[]

當釋放後仍然讀寫時,即若是內存釋放後再被訪問,就可能覆蓋其餘部分的信息,顯示輸出結果以下:Invalid write of size 1

例:

測試結果:


5、內存泄露

在程序中動態申請的內存在使用完後既沒有釋放也也法被程序的其餘部分訪問。 顯示輸出結果以下:96 bytes in 1 blocks are definitely lost in loss record 2 of……

例:

測試結果:

相關文章
相關標籤/搜索