在Linux中,我应该释放由getpwuid()返回的指针吗?

9
在调用getpwuid(uid)后,我有一个指针的引用。当我不再使用它时,我应该释放那个指针吗?阅读手册,它说它引用了一些静态区域,可能会被后续对同一函数的调用覆盖,所以我不确定是否应该触及该内存区域。
谢谢。
3个回答

12

不需要释放结果。您只能在使用malloc(3)、calloc(3) 或 realloc(3)在堆上分配内存的指针上调用free(3)。

静态数据是程序数据段或bss段的一部分,将持续存在直到进程退出(或被exec(2)覆盖)。


那么一旦加载,这些passwd结构体就无限期地保留下来了?这不是内存泄漏吗? - Alexander
1
@Alexander-ReinstateMonica 不,它是一块静态数据,每次调用 getpwuid 都会被覆盖。这就是为什么它不是线程安全/可重入的原因。内存泄漏是指分配动态内存但从未释放它。 - camh
啊,是的,那很有道理。所以我认为 getpwuid 在分配新指针之前会清理旧的字符串指针。 - Alexander
1
我相信它维护了一个malloc分配的缓冲区,如果需要增长,就使用realloc重新分配。它将密码条目读入该缓冲区,并设置指针指向其中。该缓冲区将在后续调用getpwuid时被覆盖。https://elixir.bootlin.com/glibc/latest/source/nss/getXXbyYY.c是其实现方式(类似于模板)。 - camh

5

使用*_r函数(例如getpwuid_r())进行线程安全(可重入)操作,这些函数允许您提供缓冲区以存放返回的信息。一定要检查errno以确保成功或失败。如果不使用可重入函数,则可以安全地假设该函数返回的数据不需要被释放,但是会被后续调用相同函数的数据覆盖。


似乎即使使用 *_r 函数,内存仍然存在问题。 - codingfreak

1

实际上它返回一个指向已经存在的结构体的指针,所以你不应该释放它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接