我可以将Valgrind memcheck的输出"可能丢失"视为"绝对丢失"吗?
可能丢失或"可疑":找到指向块内部的指针.指针可能最初指向开头并且已经移动,或者它可能完全不相关.Memcheck认为这样的块是"可疑的",因为不清楚它的指针是否仍然存在.
绝对丢失或"泄露":最糟糕的结果是没有找到指向该块的指针.该块被归类为"泄露",因为程序员不可能在程序退出时释放它,因为没有指向它的指针.这可能是在程序的某些早期点丢失指针的症状
我不明白为什么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指针。
因此,它可能发生的p
是NULL
,但与以前分配的存储单元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)