为什么valgrind无法检测到由于重新分配而导致的这种内存泄漏?

And*_*eri 2 c valgrind memory-leaks realloc dynamic-memory-allocation

我不明白为什么valgrind(版本3.14)没有在此程序中检测到可能的内存泄漏:

#include <stdlib.h>

int main() {
  int *p = malloc(sizeof(int));
  p = realloc(p, 2 * sizeof(int));

  free(p);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

C99标准(ISO / IEC 9899:1999,第314页)表示以下内容realloc

如果无法分配用于新对象的内存,则不会释放旧对象,并且其值不变。[...] realloc函数返回指向新对象的指针(该值可能与指向旧对象的指针的值相同),如果无法分配新对象,则返回null指针。

因此,它可能发生的pNULL,但与以前分配的存储单元malloc仍然存在,不应该这是一个可能的内存泄漏?

如果我使用编译程序gcc -std=c99并执行valgrind,--tool=memcheck --leak-check=full --track-origins=yes则会显示以下消息:

#include <stdlib.h>

int main() {
  int *p = malloc(sizeof(int));
  p = realloc(p, 2 * sizeof(int));

  free(p);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 9

Valgrind不会分析您的代码。它分析您的代码采取的行动。

在此特定运行realloc中没有失败,因此没有内存泄漏,因此valgrind没有任何报告:

所有堆块均已释放

这就是valgrind所知道的。

要检测代码中的问题,您需要一个静态代码分析工具。