struct passwd是内存泄漏的来源 - 如何正确释放?

时间:2016-10-24 19:43:54

标签: c struct memory-leaks

使用“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;
}

2 个答案:

答案 0 :(得分:3)

您可以通过提供自己的struct password和缓冲区来控制内存分配,以便将/etc/passwd读取到getpwuid_r

(这也有助于重入,这就是函数具有_r后缀的原因 - 无后缀版本被允许“分配单个全局缓冲区”。

答案 1 :(得分:2)

使用该代码,它看起来像特定于实现的库功能。当你第一次调用函数时,库分配内存并且从不释放它是很正常的:在正常执行期间没有办法或机会释放它,并且释放单个内存分配是完全没有意义的。在退出处理程序中,当它们即将被程序退出后立即释放。

您可以将这种分配视为静态数据,除非它们只是在需要时才分配缓冲区/结构的静态指针。好处是,如果从不调用相关功能,则使用更少的内存。如果函数被调用,则下行代码,运行时成本和内存使用稍微复杂一点,更不用说内存分析器混淆了,你的问题证明了这一点: - )。

像Valgrind这样的工具忽略了过滤器来隐藏这种&#34;泄漏&#34;。