C++ Linux/C++;:获取用户';没有泄漏的目录

C++ Linux/C++;:获取用户';没有泄漏的目录,c++,linux,memory-leaks,C++,Linux,Memory Leaks,下面的代码中有内存泄漏,只是试图读取用户的主目录,这是我做错了什么 static std::string getHomeDir() { struct passwd *pw = getpwuid(getuid()); std::string res( pw->pw_dir); endpwent(); return res; } valgrind抱怨说: ==32757== 160 (40 direct, 120 indirect) bytes in 1 bl

下面的代码中有内存泄漏,只是试图读取用户的主目录,这是我做错了什么

static std::string getHomeDir()
{
    struct passwd *pw = getpwuid(getuid());
    std::string res( pw->pw_dir);
    endpwent();
    return res;
}
valgrind抱怨说:

==32757== 160 (40 direct, 120 indirect) bytes in 1 blocks are definitely lost in loss record 42 of 48
==32757==    at 0x402BB7A: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==32757==    by 0x456E84E: nss_parse_service_list (nsswitch.c:678)
==32757==    by 0x456EFC9: __nss_database_lookup (nsswitch.c:175)
==32757==    by 0x4A8E168: ???
==32757==    by 0x4A8FB5C: ???
==32757==    by 0x4525FA6: getpwuid_r@@GLIBC_2.1.2 (getXXbyYY_r.c:256)
==32757==    by 0x45258ED: getpwuid (getXXbyYY.c:117)
==32757==    by 0x805AD56: getHomeDir() (ConfigReader.cpp:73)
(另外,作为旁注:
mangetpwuid
显示一个示例程序,该程序也会泄漏相同数量的内存…)

(对于那些想要与他们的linuxes进行比较的人:

uname-a
给出了
Linux参考3.5.0-47-generic#71 Ubuntu SMP周二2月18日23:59:30 UTC 2014 i686 athlon i686 GNU/Linux
…基本上Ubuntu 12.10

这是一个:

nss_解析_服务_列表泄漏少量内存


它被认为是“WONTFIX”,有一条注释说“内存被分配一次以保持全局状态,并且通常不会被释放。”

大概是
getpwuid
函数或其他一些libc函数分配了一些从未被释放的内部缓冲区。对此您无能为力,只是不用担心

与dasblinkenlight的回答相反,这不是一个bug,正如该报告的一位评论者所指出的那样:

首先,这不是泄漏。内存被分配一次以保存全局状态。它通常不会被释放。但对于内存调试器来说是


不仅如此,每次调用它都会泄漏一些内存。你可以在nss_parse_service_列表中看到调用了malloc(),当它不返回null时,有时结果会被早期的return语句泄漏。这不是很好。奇怪……在看到bug页面上的注释后,它说“后续调用不会导致它分配更多内存”。但对我来说,每次运行应用程序时,它都会抱怨…@JohnZwinck也正是我的观察结果。@fritzone:他们的意思是在一个进程中多次调用函数不会泄漏更多内存。我不相信这是100%正确的(见我上面的评论),但这意味着它是同一进程中的“后续调用”。当进程结束时,所有内存都会释放回操作系统。您包括哪些标头?我尝试了:
unistd.h
pwd.h
,但没有泄漏。。。