使用“struct passwd”隔离了5块内存泄漏。尝试了几个不同的免费(用户)电话无济于事。这个结构如何被释放?关于这个主题的几个不同的SO问题,但我找不到关于如何处理这个特定结构的文档。程序无其他问题。感谢。
#include <assert.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = getpid();
uid_t uid = getuid();
struct passwd *user = getpwuid(uid);
unsigned int bufferMaxLen = strlen(".dir.") + strlen(user->pw_name) + 10;
char* dirName = malloc(bufferMaxLen * sizeof(char));
assert(dirName != NULL);
sprintf(dirName, "%s.dir.%d", user->pw_name, pid);
printf("bufferMaxLen is: %d\n", bufferMaxLen);
printf("Directory name is: %s\n", dirName);
free(dirName);
return 0;
}
答案 0 :(得分:3)
您可以通过提供自己的struct password
和缓冲区来控制内存分配,以便将/etc/passwd
读取到getpwuid_r
。
(这也有助于重入,这就是函数具有_r
后缀的原因 - 无后缀版本被允许“分配单个全局缓冲区”。
答案 1 :(得分:2)
使用该代码,它看起来像特定于实现的库功能。当你第一次调用函数时,库分配内存并且从不释放它是很正常的:在正常执行期间没有办法或机会释放它,并且释放单个内存分配是完全没有意义的。在退出处理程序中,当它们即将被程序退出后立即释放。
您可以将这种分配视为静态数据,除非它们只是在需要时才分配缓冲区/结构的静态指针。好处是,如果从不调用相关功能,则使用更少的内存。如果函数被调用,则下行代码,运行时成本和内存使用稍微复杂一点,更不用说内存分析器混淆了,你的问题证明了这一点: - )。
像Valgrind这样的工具忽略了过滤器来隐藏这种&#34;泄漏&#34;。