本文**於:
valgrind可以用來檢測記憶體洩露,但在使用中,往往會遇到一些問題,給除錯工作帶來很多不必要的麻煩,我自己遇到的有以下兩種:
(1)記憶體洩露誤檢(系統初始化時,可能有一些需要長期儲存在記憶體中的資料結構,這些空間是永遠不釋放的,而這些記憶體會被認為絕對洩露)
(2) valgrind檢查記憶體洩露過於全面,執行後的結果太多往往很難從中找到有用的資訊。有時候,我們只需要關注某些函式,可能在執行某個操作,呼叫某些函式時會出現記憶體洩露,此時,valgrind的工作顯得冗餘而複雜
系統庫函式中提供了malloc_stats()函式,可以統計本程序具體的記憶體使用情況,精確到位元組,malloc_stats()函式宣告如下:
#include
void malloc_stats(void);
malloc_stats()執行結果如下:
arena 0://第乙個arena(每個執行緒分配乙個arena),這裡只有乙個執行緒
system bytes = 135168//本執行緒從作業系統獲得的動態記憶體,這裡是132kb
in use bytes = 1152//本執行緒在使用的動態記憶體,1152位元組
total (incl. mmap)://總的使用情況,各個執行緒使用動態記憶體的累加值
system bytes = 135168//本程序從作業系統獲得的動態記憶體,這裡是132kb
in use bytes = 1152//本程序在使用的動態記憶體,1152位元組
max mmap regions = 0//當一次申請記憶體超過128kb(32位作業系統)或1mb(64位作業系統)時,會增加mmap區域,這裡統計使用mmap區域的個數
max mmap bytes = 0//mmap區域對應記憶體大小
不說廢話,來段**看看效果
//test_malloc_stats.c#include#includeint func1();
int main()
printf("********before call func1 **********\n");
malloc_stats();//在要執行記憶體檢測的函式之前列印記憶體資訊
func1();
printf("\n@@@@@@@@after call func1 @@@@@@@@@@@\n");
malloc_stats();//在要執行記憶體檢測的函式之後列印記憶體資訊
free(p);
return 1;
}
int func1(void)//申請1024位元組,但沒有釋放,有記憶體洩露
return 0;
}
如上圖,在呼叫func1之前,記憶體使用位112b,呼叫之後,記憶體使用1152b,增加了1040位元組,說明函式func1存在記憶體洩露,此時檢查func1函式**即可。如果func1確實會造成1040b的記憶體使用,這就說明func1沒有問題。
這裡,您可能會發現申請了1024位元組,實際記憶體占用1040位元組,這正是glib庫的實現,另外的16位元組用來管理分配的資料塊
記憶體檢查工具
記憶體檢測工具主要用於檢測程式的堆疊錯誤。一般的檢測方法是通過加magic number來表示正確的記憶體資訊。如果magic number被寫壞,那麼就表示記憶體錯亂了。1編譯選項 fstack protector fstack protector all fstack protector 在函式...
如何檢查記憶體洩露
前一段時間寫了一些 自以為速度和效率都還不錯,測試執行了一段時間,發現 程式總會在中途死掉,仔細查查,原來是記憶體洩露的原故。看來寫程式還真是個細活,以後在這方面要加強。下面是我從網上搜到的檢查記憶體洩露的文章,還比較有用,牛人真是無處不在啊,以後有問題要多動手從網上找原因。如何檢查記憶體洩露問題 ...
vc記憶體洩露檢查
mfc檢測記憶體洩露是最方便的,只要在需要檢測的cpp檔案開始包含 ifdef debug define new debug new endif 就可以了。這是通過過載new操作符,在debug時可以在output中輸出記憶體洩露的位置。非mfc中檢測記憶體洩漏需要加上 ifdef debug de...