2

我用以下 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 检测到错误 Invalid read/write 和肯定丢失,这是正确的和预期的。

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

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

在此先感谢, PV

4

3 回答 3

7

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

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

于 2012-04-26T11:38:01.680 回答
0

要真正让 valgrind 检测到泄漏,您必须将另一个值影响到a.

尝试添加:

a = NULL;

在你的 for() 循环之后。

现在 valgrind 应该抱怨了!
它不会告诉你你“不可挽回地失去了”你的记忆,除非你忘记它。

于 2012-04-26T12:12:19.163 回答
-1

我认为你的意思是

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

然而,最好放置一个

#define N 10

或者

const int N = 10;

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

于 2012-04-26T11:56:21.513 回答