valgrind(memcheck)工具没有检测到内存泄漏

时间:2012-04-26 11:34:04

标签: c valgrind

我使用以下C代码引入了内存错误:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv){
int i;
int *a = (int *)malloc(sizeof(int) * 10);
if (!a) return -1; /*malloc failed*/
for (i = 0; i < 11; i++){
  a[i] = i;
}

for (i = 0; i < 11; i++){
printf("a[%d] = %d\n",i ,a[i] );
}
// free(a);
return 0;
}

memcheck检测到错误无效的读/写并且肯定丢失,这是正确的和预期的。

现在,我将同一段代码添加到我的应用程序的共享对象文件(.so)中。此应用程序作为服务运行,是一个守护程序进程。它永远不会退出。我将valgrind应用于我的应用程序并调用了修改后的'.so'。

Memcheck检测到无效的读/写错误,但并非绝对丢失,尽管所有这些错误都在一个方法中。我在帮助memcheck检测内存泄漏(肯定丢失)错误方面有所帮助吗?

提前致谢, PV

3 个答案:

答案 0 :(得分:7)

valgrind怎么知道你丢失了你分配的内存?它可以在程序结束时看到内存没有被释放,但这就是它可以为你做的一切。如果程序永远不会退出,valgrind认为你可能仍然想在以后解除分配。

即使valgrind会检查所有变量并试图检测到没有人指向你分配的内存的开头:以某种修改的形式存储地址是完全合法的;例如,到真正开始的字节(想想Pascal字符串)。因此,valgrind无法检测您的代码是否仍然知道已分配的内存。因此,valgrind甚至无法帮助你。

答案 1 :(得分:0)

要实际让valgrind检测泄漏,你必须影响a的另一个值。

尝试添加:

a = NULL;
在你的for()循环之后

现在valgrind应该抱怨! 除非你丢失跟踪它,否则它不会告诉你你“无​​可挽回地失去了”你的记忆。

答案 2 :(得分:-1)

我认为你的意思是

for (i = 0; i < 10; i++)

然而,最好放一个

#define N 10

const int N = 10;

在代码的开头,然后使用符号N而不是10