如果我使用“realloc()”,为什么Valgrind会产生“无效免费或删除”?

时间:2011-12-24 07:01:52

标签: c valgrind realloc

使用realloc()时,我用valgrind检查了它,如下所示

 valgrind --tool=memcheck --leak-check=yes --show-reachable=yes a.out

和valgrind生成的错误信息是

==6402== Memcheck, a memory error detector.
==6402== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al.
==6402== Using LibVEX rev 1575, a library for dynamic binary translation.
==6402== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP.
==6402== Using valgrind-3.1.1, a dynamic binary instrumentation framework.
==6402== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al.
==6402== For more details, rerun with: -v
==6402==
dinesh
vignesh
==6402== Invalid free() / delete / delete[]
==6402==    at 0x4905E12: realloc (vg_replace_malloc.c:306)
==6402==    by 0x400539: main (in /user/gur29597/mysourcecode/VMake/a.out)
==6402==  Address 0x7FF000830 is on thread 1's stack
vishwa
==6402==
==6402== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 1)
==6402== malloc/free: in use at exit: 0 bytes in 0 blocks.
==6402== malloc/free: 1 allocs, 1 frees, 3 bytes allocated.
==6402== For counts of detected errors, rerun with: -v
==6402== All heap blocks were freed -- no leaks are possible.

我的代码如下,

#include<stdio.h>

int main()
{
  char *name[2];

 name[0]="dinesh";

 name[1]="vignesh";

  printf("%s\n%s\n",name[0],name[1]);

  realloc(name,3);

  name[2]="vishwa";

  printf("%s\n",name[2]);

 return 0;
}

2 个答案:

答案 0 :(得分:6)

您的程序导致未定义的行为,并且valgrind正确指出了它。

参考:

C99标准7.20.3.4-1:重新分配功能:

概要

  

#include
  void * realloc(void * ptr,size_t size);

第3段:

  

如果ptr是空指针,则realloc函数的行为类似于指定大小的malloc函数。否则,ifptr与先前由callocmallocrealloc函数返回的指针不匹配,或者如果通过调用free或已释放空间realloc功能,行为未定义。如果无法分配newobject的内存,则不会释放旧对象,并且其值不会更改。

请注意,在您的情况下,传递给realloc的指针不为空,而且也未通过调用callocmallocrealloc来接收,这违反了强制要求因此,标准是未定义的行为。

答案 1 :(得分:5)

您只能对从malloc或realloc返回的指针使用realloc。换句话说,你的程序是错误的。