Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构passwd是内存泄漏的来源-如何正确释放?_C_Struct_Memory Leaks - Fatal编程技术网

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

C 结构passwd是内存泄漏的来源-如何正确释放?,c,struct,memory-leaks,C,Struct,Memory Leaks,通过使用“struct passwd”隔离了一个5块内存泄漏。尝试了几个不同的免费(用户)呼叫,但均无效。这个结构是如何被释放的?关于这个主题有几个不同的SO问题,但我发现很少有关于如何处理这个特殊结构的文档。程序运行时不会出现其他问题。谢谢 #include <assert.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #i

通过使用“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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
pid_t pid=getpid();
uid\u t uid=getuid();
结构passwd*user=getpwuid(uid);
unsigned int bufferMaxLen=strlen(“.dir”)+strlen(user->pw_name)+10;
char*dirName=malloc(bufferMaxLen*sizeof(char));
断言(dirName!=NULL);
sprintf(dirName,“%s.dir.%d”,用户->pw_名称,pid);
printf(“bufferMaxLen是:%d\n”,bufferMaxLen);
printf(“目录名为:%s\n”,目录名);
免费(dirName);
返回0;
}

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


(这也有助于重入,这就是为什么函数有一个
\u r
后缀——不带后缀的版本“允许”分配一个全局缓冲区)。

您可以通过提供自己的
结构密码
和一个用于读取
/etc/passwd
getpwuid\r
的缓冲区来控制内存分配


(这也有助于可重入性,这就是为什么函数有一个
\r
后缀——不带后缀的版本“允许”分配一个全局缓冲区)。

对于该代码,它看起来像是特定于实现的库功能。库在您第一次调用函数时分配内存是很正常的,而且永远不会释放它:在正常执行期间,没有任何方法或机会释放内存,而且在退出处理程序时释放单个内存分配是完全没有意义的,因为程序退出后将立即释放这些内存分配

您可以将此类分配视为静态数据,但它们只是指向缓冲区/结构的静态指针,仅在需要时分配。好处是,如果从未调用相关函数,则使用的内存更少。缺点是,如果函数被调用,代码、运行时成本和内存使用会稍微复杂一些,更不用说内存分析器混乱了,您的问题:-)说明了这一点


像Valgrind这样的工具有忽略过滤器来隐藏这种“泄漏”。

有了这些代码,它看起来像是特定于实现的库功能。库在您第一次调用函数时分配内存是很正常的,而且永远不会释放它:在正常执行期间,没有任何方法或机会释放内存,而且在退出处理程序时释放单个内存分配是完全没有意义的,因为程序退出后将立即释放这些内存分配

您可以将此类分配视为静态数据,但它们只是指向缓冲区/结构的静态指针,仅在需要时分配。好处是,如果从未调用相关函数,则使用的内存更少。缺点是,如果函数被调用,代码、运行时成本和内存使用会稍微复杂一些,更不用说内存分析器混乱了,您的问题:-)说明了这一点


像Valgrind这样的工具有用于隐藏这种“泄漏”的忽略过滤器。

您如何知道它正在泄漏内存
man getpwuid
明确声明“返回值可能指向一个静态区域,并且可能会被随后对getpwent(3)、getpwnam()或getpwuid()的调用所覆盖。(不要将返回的指针传递给free(3)。”我相信
getpwuid
的确切工作方式是特定于平台的,即使忽略警告,也无法释放所有内存的原因当然是函数分配了一个内部缓冲区用于读取/etc/password(可能是用于与身份服务交互)。@LHMathies-lol,我刚刚做了一个类似的项目,又遇到了同样的问题-你是通灵者!你怎么知道它正在泄漏内存
man getpwuid
明确声明“返回值可能指向一个静态区域,并且可能会被随后对getpwent(3)、getpwnam()或getpwuid()的调用所覆盖。(不要将返回的指针传递给free(3)。”我相信
getpwuid
的确切工作方式是特定于平台的,即使忽略警告,也无法释放所有内存的原因当然是函数分配了一个内部缓冲区用于读取/etc/password(可能是用于与身份服务交互)。@LHMathies-lol,我刚刚做了一个类似的项目,又遇到了同样的问题-你是通灵者!很好的一点是,这种泄漏是“正常的”,你应该设置Valgrind来忽略它,除非你这样做是为了证明你可以:)有趣!没有这样的动机,只是在检查泄漏的实践中。很好的一点是,这种泄漏是“正常的”,你应该设置Valgrind来忽略它,除非你这样做是为了证明你可以:)有趣!没有这样的动机,只是在检查泄漏的实践中。