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

标签 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 检测到错误 Invalid read/write and definitely lost,这是正确的,也是预期的。

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

Memcheck 检测到 Invalid read/write 错误,但并非绝对丢失,尽管所有这些错误都在一个方法中。我可以得到一些帮助使 memcheck 检测到内存泄漏(肯定丢失)错误吗?

提前致谢, 光伏

最佳答案

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

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

关于c - valgrind (memcheck) 工具没有检测到内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10332561/

相关文章:

c - 打印大写字母的十六进制

c - 对同一个文件的多个 read() 操作

c - valgrind 错误大小 8 的无效读取

c++ - 使用 Valgrind 检查时,Libzip 示例包含未初始化的值

c++ - valgrind 报告 mysql_real_connect 泄漏

c - 在 c 中以 double 作为输入的函数中传递 double**

c - 将无穷大赋给 float

c - 哪个更快?取消引用指针或使用方括号?

valgrind - 为内存泄漏生成抑制

c - 使用 pthreads 时仍然可以访问的字节数