getpwnam()
не страдает от утечки памяти. Последующие вызовы действительно перезапишут его статический внутренний буфер.
Такого рода функции вместо этого не входящие и, следовательно, не поточно-безопасные . Пол предложил использовать getpwnam_r()
, который является повторно входящей версией, которая безопасна для использования в многопоточном контексте.
При этом утечки памяти вызваны теми системными вызовами, которые выделяют память с помощью malloc()
и оставляют приложение ответственным за free()
память после использования возвращаемых данных.
В этих случаях рекомендуется использовать идиому RAII, чтобы не забыть освободить выделенную память - см. Исключение безопасности. std::tr1::shared_ptr<>
также является жизнеспособным способом: для shared_ptr пользовательский указатель должен быть предоставлен free()
необработанному указателю, когда shared_ptr выходит из области видимости.
С этой точки зрения некоторые опасные функции: scandir()
, asprintf()
, vasprintf()
и т. Д.