gpt4 book ai didi

c - setpwent 显示 valgrind 中的内存泄漏

转载 作者:行者123 更新时间:2023-12-04 06:21:47 27 4
gpt4 key购买 nike

我正在检查我的程序是否存在内存泄漏和损坏以及
我在使用 setpwent 时遇到问题。
将简单程序视为:

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

main()
{
struct passwd *ent=NULL;
setpwent();
while ((ent = getpwent()) != NULL) { }
endpwent();
}

当我在 valgrind 中运行这段代码时,我得到了这个:
> valgrind  --track-origins=yes
> --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes ./a.out . . . 160 (40 direct, 120 indirect) bytes in 1
> blocks are definitely lost in loss
> record 11 of 11
> ==6471== at 0x4025BD3: malloc (vg_replace_malloc.c:236)
> ==6471== by 0x411CA9C: nss_parse_service_list
> (nsswitch.c:622)
> ==6471== by 0x411D216: __nss_database_lookup (nsswitch.c:164)
> ==6471== by 0x459BEAB: ???
> ==6471== by 0x459C1EC: ???
> ==6471== by 0x411D864: __nss_setent (getnssent_r.c:84)
> ==6471== by 0x40D304F: setpwent (getXXent_r.c:127)
> ==6471== by 0x8048469: main (in /root/workspace/cdk-examples/MMC-0.64/a.out)
> ==6471==
> ==6471== LEAK SUMMARY:
> ==6471== definitely lost: 40 bytes in 1 blocks
> ==6471== indirectly lost: 120 bytes in 10 blocks
> ==6471== possibly lost: 0 bytes in 0 blocks
> ==6471== still reachable: 0 bytes in 0 blocks
> ==6471== suppressed: 0 bytes in 0 blocks

我应该担心吗?
我怎样才能消除这个问题?

第二个问题:
我是否需要将密码条目释放为:
main()
{
struct passwd *ent=NULL;
setpwent();
while ((ent = getpwent()) != NULL) {
free(ent);
}
endpwent();
}

感谢你们对我的帮助。

最佳答案

对于第一个问题。我认为您不需要调用 setpwent反正。这是第一次调用 getpwent (在进程开始之后或 endpwent 之后)回到开始。

您只需要setpwent如果你想在调用 getpwent 后快退但没有调用 endpwent .

set可能比 end/get 快对,特别是如果我怀疑整个(或相当大比例的)文件可能缓存在内存中(a)。

对于第二个问题,不,你不释放它。见 here .它很可能会使用静态缓冲区(用于单线程)或线程本地存储(用于多线程)。

在这两种情况下,管理缓冲区的是调用本身,而不是您的代码 (a)。

(a) 有趣的是,ent 的值在每次迭代中传回的内容都是不同的,这当然看起来像是单独的分配。

但是,由于地址仅相隔 32 个字节,并且大小为 struct pwd是 32 字节,没有空间干预 malloc家政信息。

所以,要么管家信息不是内联的(不太可能),要么你实际上是在使用一组结构而不是单独的分配。

以下程序显示了这一点:

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

int main (void) {
struct passwd *ent = NULL;
printf ("ent struct is %d bytes\n", sizeof(*ent));
while ((ent = getpwent()) != NULL) {
printf ("pointer is %p, user is %s\n", ent, ent->pw_name);
// free (ent);
}
endpwent();
return 0;
}

它输出:
ent struct is 32 bytes
pointer is 0x4708d0, user is alan
pointer is 0x4708f0, user is bill
pointer is 0x470910, user is carl
pointer is 0x470930, user is dawn
pointer is 0x470950, user is ella
pointer is 0x470970, user is fran

这就是导致我得出上述结论的原因。无论如何,在我取消注释 free 的那一刻在我的代码行中,我得到了一个核心转储,为我的理论提供了更多支持。

现在我想我可以去看看 getpwent源代码,但我喜欢一个很好的谜题:-)

关于c - setpwent 显示 valgrind 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6463053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com