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 + +中内存泄露(一)