2在內存釋放之后讀寫內存
代碼:
#包括<stdio.h>
#包括<stdlib.h>
INT主要(無效)
{
的char * p = malloc的(1);
* p ='A';
字符c = * p;
printf(“請\ n [%C] \ n”,c);
免費(對);
C = * p;
返回0;
}
讓我們運行memcheck,查看valgrind的必須提供的場景。
Valgrind的 - 工具= memcheck ./val2
== 3106 == Memcheck,一個內存錯誤檢測器
== 3106 ==版權所有(C)2002-2009,GNUGPL'd,由Julian Seward的等。
== 3106 ==使用Valgrind的3.5.0和LibVEX的;重新運行時用-h的版權信息
== 3106 ==命令:./val2
== 3106 ==
[一]
== 3106 ==無效的讀取大小為1
== 3106 == 0x40056F中的main(val2.c:14)
== 3106 ==地址0x4c25040是0字節內blockof大小free'd
== 3106 ==在0x4A05A31:免費(vg_replace_malloc.c:325)
== 3106 == 0x40056A:主要(val2.c:13)
== 3106 ==
== 3106 ==
== 3106 == HEAP摘要:
== 3106 == 0塊的使用在出口:0字節
== 3106 ==總堆的使用情況:1 allocs,1釋放,1個字節分配
== 3106 ==
== 3106 ==所有的堆塊被釋放 - noleaks是可能的
== 3106 ==
== 3106 ==計數檢測到andsuppressed錯誤,請重新運行:-V
== 3106 == ERROR摘要:1(抑制錯誤1contexts:4投4中)
正如上面所示,工具檢測到不可用的讀取,并且東華萊佛士打印出警告“無效的讀取尺寸為1”。
3讀寫的malloc塊結束之后的內存
代碼:
#包括<stdio.h>
#包括<stdlib.h>
INT主要(無效)
{
的char * p = malloc的(1);
* p ='A';
字符c =(P +1);
printf(“請\ n [%C] \ n”,c);
免費(對);
返回0;
}
現在我們針對這段代碼運行Valgrind的。
美元的valgrind - 工具= memcheck / VAL
== 2835 == Memcheck,一個內存錯誤檢測器
== 2835 ==版權所有(C)2002-2009,GNUGPL'd,由Julian Seward的等。
== 2835 ==使用Valgrind的3.6.0.SVN-Debianand LibVEX重新運行與-h的版權信息
== 2835 ==命令:。/ VAL
== 2835 ==
== 2835 ==無效的讀取大小為1
== 2835 ==在0x4005D9:主(valgrind.c:25)
== 2835 ==地址0x51b0041后為0字節,塊大小為1 alloc'd
== 2835 ==在0x4C274A8:malloc的(vg_replace_malloc.c:236)
== 2835 == 0x4005C5:主(valgrind.c:22)
== 2835 ==
[]
== 2835 ==
== 2835 == HEAP摘要:
== 2835 == 0塊的使用在出口:0字節
== 2835 ==總堆的使用情況:1 allocs,1釋放,1個字節分配
== 2835 ==
== 2835 ==所有的堆塊被釋放 - noleaks是可能的
== 2835 ==
== 2835 ==對于計數檢測到andsuppressed錯誤,請重新運行:-V
== 2835 == ERROR摘要:1(抑制錯誤1contexts:4從4)
在這個實例中,工具也檢查到執行不可用的讀取。
4內存泄露
代碼:
#包括<stdio.h>
#包括<stdlib.h>
INT主要(無效)
{
的char * p = malloc的(1);
* p ='A';
字符c = * p;
printf(“請\ n [%C] \ n”,c);
返回0;
}
美元的valgrind - 工具= memcheck - 泄漏檢查全/ VAL
== 2888 == Memcheck,一個內存錯誤檢測器
== 2888 ==版權所有(C)2002-2009,GNUGPL'd,,朱利安·蘇厄德等。
== 2888 ==使用Valgrind的3.6.0.SVN-Debianand LibVEX重新運行與-h的版權信息
== 2888 ==命令:。/ VAL
== 2888 ==
[一]
== 2888 ==
== 2888 == HEAP摘要:
== 2888 ==口:1個字節,1塊
== 2888 ==總堆的使用情況:1 allocs,0救出,1個字節分配
== 2888 ==
== 2888 == 1字節1塊1 1負的戰績肯定是丟在
== 2888 ==在0x4C274A8:malloc的(vg_replace_malloc.c:236)
== 2888 == 0x400575:主要(valgrind.c:6)
== 2888 ==
== 2888 == LEAK摘要:
== 2888 ==肯定丟失:1字節,1塊
== 2888 ==間接損失:0字節0塊
== 2888 ==可能丟失:0字節0塊
== 2888 ==仍可達0字節0塊
== 2888 ==抑制:0字節0塊
== 2888 ==
== 2888 ==對于計數檢測到andsuppressed錯誤,請重新運行:-V
== 2888 == ERROR摘要:1(抑制錯誤1contexts:4投4中)
上面粗體行顯示工具能夠檢測到內存泄露。
5 malloc /新/新[]和自由/刪除/刪除[]不匹配
代碼:
#包括<stdio.h>
#包括<stdlib.h>
#包括<iostream>
INT主要(無效)
{
的char * p =(CHAR *)malloc的(1);
* p ='A';
字符c = * p;
printf(“請\ n [%C] \ n”,c);
刪除P;
返回0;
}
讓我們運行工具,結果如下:
美元的valgrind - 工具= memcheck - 泄漏檢查全/ VAL
== 2972 == Memcheck,一個內存錯誤檢測器
== 2972 ==版權所有(C)2002-2009,GNUGPL'd,由Julian Seward的等。
== 2972 ==使用Valgrind的3.6.0.SVN-Debianand LibVEX重新運行與-h的版權信息
== 2972 ==命令:。/ VAL
== 2972 ==
[一]
== 2972 ==不匹配的free()/刪除/刪除[]
== 2972 == 0x4C26DCF中的operator delete(void *)的(vg_replace_malloc.c:387)
== 2972 == 0x40080B:主要(valgrind.c:13)
== 2972 ==地址0x595e040是0字節塊內的大小為1 alloc'd
== 2972 ==在0x4C274A8:malloc的(vg_replace_malloc.c:236)
== 2972 == 0x4007D5:(valgrind.c:7)
== 2972 ==
== 2972 ==
== 2972 == HEAP摘要:
== 2972 ==出口:0字節0塊
== 2972 ==總堆的使用情況:1 allocs,1釋放,1個字節分配
== 2972 ==
== 2972 ==所有的堆塊被釋放 - noleaks是可能的
== 2972 ==
== 2972 ==對于計數檢測到andsuppressed錯誤,請重新運行:-V
== 2972 == ERROR摘要:1(抑制錯誤1contexts:4投4中)
我們從上面輸出看到(參見粗體行),工具清楚的說明“不匹配的free()/刪除/刪除[]”。
我們試圖在測試代碼中使用新的和自由的組合,并且看到工具給出的結果。
兩次釋放內存
代碼:
#包括<stdio.h>
#包括<stdlib.h>
INT主要(無效)
{
的char * p =(CHAR *)malloc的(1);
* p ='A';
字符c = * p;
printf(“請\ n [%C] \ n”,c);
免費(對);
免費(對);
返回0;
}
美元的valgrind - 工具= memcheck - 泄漏檢查全/ VAL
== 3167 == Memcheck,一個內存錯誤檢測器
== 3167 ==版權所有(C)2002-2009,GNUGPL'd,由Julian Seward的等。
== 3167 ==使用Valgrind的3.6.0.SVN-Debianand LibVEX重新運行與-h的版權信息
== 3167 ==命令:。/ VAL
== 3167 ==
[一]
== 3167 ==無效的free()/刪除/刪除[]
== 3167 == 0x4C270BD:免費(vg_replace_malloc.c:366)
== 3167 == 0x40060A:主要(valgrind.c:12)
== 3167 ==地址0x51b0040是0字節塊內的大小為1 free'd
== 3167 == 0x4C270BD:免費(vg_replace_malloc.c:366)
== 3167 == 0x4005FE:主要(valgrind.c:11)
== 3167 ==
== 3167 ==
== 3167 == HEAP摘要:
== 3167 == 0塊的使用在出口:0字節
== 3167 ==總堆的使用情況:1 allocs,2釋放,1個字節分配
== 3167 ==
== 3167 ==所有的堆塊被釋放 - noleaks是可能的
== 3167 ==
== 3167 ==計數檢測到andsuppressed錯誤,請重新運行:-V
== 3167 == ERROR摘要:1(抑制錯誤1contexts:4投4中)
如上面輸出看到,工具檢測到我們在相同的指針上調用了兩次免費的。
返回閱讀:如何使用Valgrind的內存檢查工具檢查C / C + +中內存泄露(一)