Я не могу понять, почему valgrind (версия 3.14) не обнаруживает возможную утечку памяти в этой программе:
#include <stdlib.h>
int main() {
int *p = malloc(sizeof(int));
p = realloc(p, 2 * sizeof(int));
free(p);
return 0;
}
Стандарт C99 (ISO / IEC 9899: 1999, стр. 314) гласит:это примерно realloc
:
Если память для нового объекта не может быть выделена, старый объект не освобождается и его значение не изменяется. [...] Функция realloc возвращает указатель на новый объект (который может иметь то же значение, что и указатель на старый объект), или нулевой указатель, если новый объект не может быть выделен.
Так что может случиться так, что p
- это NULL
, но ячейка памяти, ранее выделенная с помощью malloc
, все еще там, разве это не может быть возможной утечкой памяти?
Если я скомпилирую программус gcc -std=c99
и я выполняю valgrind с --tool=memcheck --leak-check=full --track-origins=yes
, это выдает следующее сообщение:
==313618== Memcheck, a memory error detector
==313618== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==313618== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==313618== Command: ./a.out
==313618==
==313618==
==313618== HEAP SUMMARY:
==313618== in use at exit: 0 bytes in 0 blocks
==313618== total heap usage: 2 allocs, 2 frees, 12 bytes allocated
==313618==
==313618== All heap blocks were freed -- no leaks are possible
==313618==
==313618== For counts of detected and suppressed errors, rerun with: -v
==313618== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)