首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >valgrind (memcheck)工具未检测到内存泄漏

valgrind (memcheck)工具未检测到内存泄漏
EN

Stack Overflow用户
提问于 2012-04-26 19:34:04
回答 3查看 2.2K关注 0票数 2

我用下面这段C代码引入了内存错误:

代码语言:javascript
复制
#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和detects的错误,这是正确的和预期的。

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

Memcheck检测到无效的读/写错误,但不一定会丢失尽管所有这些错误都在一个method.can中我得到了一些帮助,使memcheck检测内存泄漏(肯定丢失)错误?

EN

回答 3

Stack Overflow用户

发布于 2012-04-26 19:38:02

valgrind如何知道您丢失了对已分配内存的跟踪?它可以在程序结束时看到内存没有被释放,但这是它能为您做的所有事情。如果程序永远不会退出,valgrind认为您可能仍然希望稍后释放它。

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

票数 7
EN

Stack Overflow用户

发布于 2012-04-26 20:12:19

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

尝试添加:

代码语言:javascript
复制
a = NULL;

在您的for()循环之后。

现在valgrind应该抱怨了!

它不会告诉你,你“无可救药地失去了”你的记忆,除非你跟踪它。

票数 0
EN

Stack Overflow用户

发布于 2012-04-26 19:56:22

我想你的意思是

代码语言:javascript
复制
for (i = 0; i < 10; i++)

但是,最好将一个

代码语言:javascript
复制
#define N 10

代码语言:javascript
复制
const int N = 10;

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10332561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档