简体   繁体   中英

Why Valgrind producing “invalid free or delete” if I use “realloc()”?

While using realloc(), I checked it with valgrind as follows

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

and the error information produced by valgrind is

==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.

My code is as follows ,

#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;
}

Your program causes Undefined Behavior and valgrind correctly points it out.

Reference:

C99 Standard 7.20.3.4-1: The realloc function:

Synopsis

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

Para 3:

If ptr is a null pointer, the realloc function behaves like the malloc function for the specified size. Otherwise, ifptr does not match a pointer earlier returned by the calloc , malloc ,or realloc function, or if the space has been deallocated by a call to the free or realloc function, the behavior is undefined . If memory for the newobject cannot be allocated, the old object is not deallocated and its value is unchanged.

Note that in your case the pointer being passed to realloc is not null ans also was not received by calling calloc , malloc or realloc which breaks the requirements mandated by the standard hence the Undefined Behavior.

You can use realloc ONLY on pointers that have been returned from malloc or realloc. In other words, your program is wrong.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM