Linux / C ++: récupérer le répertoire de l’utilisateur sans fuite

Que fais-je à tort qu’il y a des memory leaks dans le code suivant qui essaie simplement de lire le répertoire personnel de l’utilisateur?

static std::ssortingng getHomeDir() { struct passwd *pw = getpwuid(getuid()); std::ssortingng res( pw->pw_dir); endpwent(); return res; } 

Valgrind se plaint:

 ==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) 

(aussi, en sidenote: man getpwuid montre un exemple de programme, qui fuit aussi la même quantité de mémoire …)

(et pour ceux qui veulent comparer avec leurs linux:

uname -a donne la Linux reference 3.5.0-47-generic #71-Ubuntu SMP Tue Feb 18 23:59:30 UTC 2014 i686 athlon i686 GNU/Linux … essentiellement Ubuntu 12.10

Ceci est un bug connu :

nss_parse_service_list perd une petite quantité de mémoire

Il est considéré comme résolu comme “WONTFIX”, avec un commentaire indiquant que “la mémoire est allouée une fois pour conserver l’état global, et n’est normalement pas libérée”.

getpwuid fonction getpwuid ou d’autres fonctions libc allouent probablement des tampons internes qui ne sont jamais libérés. Vous ne pouvez pas faire grand chose à ce sujet, ne vous inquiétez pas de cela.

Contrairement à la réponse de dasblinkenlight, ce n’est pas un bug, comme le souligne l’un des commentateurs de ce rapport:

Tout d’abord, ce n’est pas une fuite. La mémoire est allouée une fois pour conserver l’état global. Il n’est normalement pas libéré. Mais pour les débogueurs de mémoire, c’est le cas.