После вызова getpwuid(uid) у меня есть ссылка на указатель. Следует ли мне освободить этот указатель, когда я его больше не использую? Читая страницы руководства, он говорит, что ссылается на некоторую статическую область, которая может быть перезаписана последующими вызовами тех же функций, поэтому я не уверен, следует ли мне трогать эту область памяти.
Спасибо.





Фактически он возвращает указатель на уже существующую структуру, поэтому вы должны освободить его с помощью нет.
Нет. Вам не нужно освобождать результат. Вы можете вызывать free (3) только для указателей, выделенных в куче, с помощью malloc (3), calloc (3) или realloc (3).
Статические данные являются частью данных программы или сегментов bss и будут сохраняться до завершения процесса (или до перезаписи с помощью exec (2)).
@ Alexander-ReinstateMonica Нет, это отдельные статические данные, которые будут перезаписываться при каждом вызове getpwuid. Вот почему он не является потокобезопасным / реентерабельным. Утечка памяти - это когда вы выделяете динамическую память и никогда ее не освобождаете.
Ах да, в этом есть смысл. Итак, я предполагаю, что getpwuid очищает старые указатели строк, прежде чем назначать новые.
Я считаю, что он поддерживает буфер malloc'ed, который он повторно блокирует для увеличения, если это необходимо. Он считывает ввод пароля в этот буфер и устанавливает указатели, указывающие на него. Буфер будет перезаписан при последующих вызовах getpwuid. elixir.bootlin.com/glibc/latest/source/nss/getXXbyYY.c - это реализация (как своего рода шаблон).
Используйте функции *_r (getpwuid_r()) для потоковобезопасных (реентерабельных) функций, которые позволяют вам предоставить буферное пространство для размещения возвращаемой информации. Обязательно проверьте errno на успех или неудачу. Если вы не используете реентерабельные функции, вы можете с уверенностью предположить, что функция возвращает данные, которые не нужно освобождать, но которые также будут перезаписаны последовательными вызовами той же функции.
Кажется, есть проблемы с памятью даже в функциях * _r
Значит, после загрузки эти структуры passwd остаются на неопределенное время? Разве это не утечка памяти?