2014-04-09 17 views
7

Co robię nie tak, że w poniższym kodzie są wycieki pamięci, które po prostu próbują odczytać katalog domowy użytkownika?Linux/C++: pobranie katalogu użytkownika bez wycieków

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

valgrind narzeka:

==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: [email protected]@GLIBC_2.1.2 (getXXbyYY_r.c:256) 
==32757== by 0x45258ED: getpwuid (getXXbyYY.c:117) 
==32757== by 0x805AD56: getHomeDir() (ConfigReader.cpp:73) 

(również jako sidenote: man getpwuid pokazują przykładowy program, który również przecieki taką samą ilość pamięci ...)

(i dla tych, którzy chcą porównać z ich linuxami:

uname -a daje Linux reference 3.5.0-47-generiC#71-Ubuntu SMP Tue Feb 18 23:59:30 UTC 2014 i686 athlon i686 GNU/Linux ... w zasadzie Ubuntu 12.10

+0

jakie nagłówki zawierasz? Próbowałem: 'unistd.h' i' pwd.h' i nie dostałem żadnych przecieków ... – Massa

Odpowiedz

9

To known bug:

nss_parse_service_list przecieki niewielką ilość pamięci

uważa się za rozwiązany jako „WONTFIX”, z komentarzem stwierdzającym, że „pamięć jest przydzielana do przechowywania globalny stan i zwykle nie jest zwalniany. "

+0

Co więcej, może on przeciekać pewną ilość pamięci za każdym razem, gdy zostanie wywołany. http://www.ic.unicamp.br/~islene/2s2008-mo806/libc/nss/nsswitch.c możesz zobaczyć na nss_parse_service_list, że wywołanie funkcji malloc() i gdy nie zwraca wartości null, czasami wynik jest wyciekły przez wcześniejsze oświadczenia zwrotne. To nie jest zbyt dobre. –

+0

Dziwne ... Po obejrzeniu komentarzy na stronie błędu mówi "kolejne wywołania nie powodują przydzielenia dodatkowej pamięci". Ale dla mnie za każdym razem, gdy uruchamiam aplikację, narzeka na to ... – fritzone

+0

@JohnZwinck dokładnie moja obserwacja. – fritzone

3

Prawdopodobnie funkcja getpwuid lub inne funkcje libc przydzielają pewne wewnętrzne bufory, które nigdy nie są zwalniane. Nie możesz wiele z tym zrobić, po prostu nie martw się o to.

Wbrew odpowiedź dasblinkenlight, jest to nie bug, jako jeden z komentujących do tego raportu zaznacza:

Przede wszystkim, to nie jest przeciek. Pamięć jest przydzielana jednokrotnie, aby utrzymać stan globalny. Zwykle nie jest wolny. Ale dla debuggerów pamięci jest.

Powiązane problemy