【发布时间】:2016-10-24 19:43:53
【问题描述】:
使用“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;
}
【问题讨论】:
-
你怎么知道它在泄漏内存?
man getpwuid明确声明“返回值可能指向静态区域,并且可能被后续调用 getpwent(3)、getpwnam() 或 getpwuid() 覆盖。(不要将返回的指针传递给免费(3)。)“ -
我相信
getpwuid的确切工作方式是特定于平台的。 -
valgrind
-
哦,即使忽略警告也无法释放所有内存的原因当然是该函数分配了一个内部缓冲区来读取 /etc/password (大概是与身份服务交互)。
-
@LHMathies - 哈哈,我只是在做一个类似的项目,但又遇到了同样的问题 - 你是通灵者!
标签: c struct memory-leaks