本文轉自:peter tang
最近在學習數據結構的時候總是遇到關於內存錯誤的問題,因爲數據結構這塊多用指針,由此產生的段錯誤多不勝數,因此學習了一下valgrind這個工具,來檢測我們的程序是如何出現內存問題的。
centos系統下的valgrind,首先我們得有autoconf和automake兩個工具,一般系統都會自配。
安裝過程:
wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2
tar -jxvf valgrind-3.10.1.tar.bz2
cd valgrind-3.10.1
./autogen.sh (這一步可能遇上沒有安裝上面兩個工具的錯誤提示)
./configure
sudo make && make install
valgrind --version (檢測版本,看是否安裝成功)
到此,我們的工具安裝成功。
我們在編譯程序的時候加上-g -fno-inline 保留調試信息。
測試命令:
$ valgrind --tool=memcheck --log-file=/home/yangni/var_log --leak-check=full --error-limit=no --show-leak-kinds=all ./a.out
–leak-check=full 指的是完全檢查內存泄漏。
–show-reachable=yes是顯示內存泄漏的地點。
–trace-children=yes:跟入子進程
–track-origins=yes:查看哪裏沒有進行初始化。當程序正常退出的時候valgrind自然會輸出內存泄漏的信息。
–log-file= 是存放詳細信息的日誌文件,我們將其顯示在終端可不要。/home/yangni/var_log 是我重定義的輸出路徑。
接下來用一個小程序測試一下:
#include <stdio.h>
void function()
{
int *p = (int*)malloc(10*sizeof(int));
p[10] = 0;
}
int main()
{
function();
return 0;
}
上面的程序很明顯沒有free而造成內存泄漏,內存泄露(Memory leak)指的是,在程序中動態申請的內存,在使用完後既沒有free,又無法被程序的其他部分訪問。內存泄露是在開發大型程序中最令人頭疼的問題,以至於有 人說,內存泄露是無法避免的。其實不然,防止內存泄露要從良好的編程習慣做起,另外,有工具幫助我們檢測更好!
#include <stdio.h>
int main()
{
int a;
if (a==1)
{
printf("a==%d\n",a);
return 0;
}
}
#include <stdio.h>
int main()
{
int *a = (int*)malloc(5*sizeof(int));
a[5] = 1;
return 0;
}