Зачем Valgrind выдавать «недействительно free или delete», если я использую «realloc ()»? - PullRequest
2 голосов
/ 24 декабря 2011

При использовании 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 ]

6 голосов
/ 24 декабря 2011

Ваша программа вызывает Неопределенное поведение и valgrind правильно указывает на это.

Справка:

C99 Standard 7.20.3.4-1: функция realloc:

Синопсис

# включает
void * realloc (void * ptr, size_t size);

Параграф 3:

Если ptr является нулевым указателем, функция realloc ведет себя как функция malloc для указанного размера. В противном случае, если ifptr не соответствует указателю, ранее возвращенному функцией calloc, malloc или realloc, или если пространство было освобождено при вызове функции free или realloc, поведение недеформированной определено . Если память для нового объекта не может быть выделена, старый объект не освобождается и его значение не изменяется.

Обратите внимание, что в вашем случае указатель, передаваемый на realloc, не является нулевым и также не был получен путем вызова calloc, malloc или realloc, что нарушает требования, предписанные стандартом и, следовательно, неопределенным поведением.

5 голосов
/ 24 декабря 2011

Вы можете использовать realloc ТОЛЬКО для указателей, которые были возвращены из malloc или realloc.Другими словами, ваша программа неверна.

...