Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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中的man 2 stat成员创建的泄漏_C_Macos_Unix_Malloc_Free - Fatal编程技术网

如何修复由c中的man 2 stat成员创建的泄漏

如何修复由c中的man 2 stat成员创建的泄漏,c,macos,unix,malloc,free,C,Macos,Unix,Malloc,Free,我正在重新实现unix ls命令,但当我测试泄漏时,它显示:进程44151:248节点malloced为45 KB,进程44151:28泄漏为560个总泄漏字节。所以我试着释放pwd和grp。但它说我正在释放从未分配的内存 static int one(const struct dirent *unused) { (void)unused; return (1); } void ls_l(void) { struct stat s

我正在重新实现unix ls命令,但当我测试泄漏时,它显示:进程44151:248节点malloced为45 KB,进程44151:28泄漏为560个总泄漏字节。所以我试着释放pwd和grp。但它说我正在释放从未分配的内存

static int      one(const struct dirent *unused)
{
    (void)unused;
    return (1);
}

void            ls_l(void)
{
    struct stat     statbuf;
    struct group    *grp;
    struct passwd   *pwd;
    struct dirent   **sd;
    int             n;
    int             i;

    pwd = getpwuid((geteuid()));
    n = scandir(".", &sd, one, alphasort);
    i = 1;
    while (i < n)
    {
        while (strncmp(sd[i]->d_name, ".", 1) == 0)
            i++;
        if (stat(sd[i]->d_name, &statbuf) == 0)
        {
            ft_perm(sd[i]->d_name);
            ft_printf(" %-2d %4s  ", statbuf.st_nlink, pwd->pw_name);
            if ((grp = getgrgid(statbuf.st_gid)) != NULL)
                ft_printf(" %-8.8s %5d %s %s\n",grp->gr_name,
                        (int)statbuf.st_size,ft_group(ctime(&statbuf.st_mtime)),
                        sd[i]->d_name);
            else
                ft_printf(" %-8d %5d %s %s\n", statbuf.st_gid,
                        (int)statbuf.st_size,ft_group(ctime(&statbuf.st_mtime)),
                        sd[i]->d_name);
        }
        free(sd[i]);
        i++;
    }
    free(sd);
}
static int one(const struct dirent*未使用)
{
(无效)未使用;
申报表(1);
}
无效ls_l(无效)
{
结构stat statbuf;
结构组*grp;
结构密码*pwd;
结构方向**sd;
int n;
int i;
pwd=getpwuid((geteuid());
n=扫描顺序(“.”,&sd,一,字母排序);
i=1;
而(id_name,“.”,1)==0)
i++;
if(stat(sd[i]>d_name,&statbuf)==0)
{
ft_perm(sd[i]>d_name);
ft_printf(“%-2d%4s”,statbuf.st_nlink,pwd->pw_name);
if((grp=getgrgid(statbuf.st_gid))!=NULL)
ft_printf(“%-8.8s%5d%s%s\n”,grp->gr_名称,
(int)statbuf.st_大小,ft_组(ctime(&statbuf.st_mtime)),
sd[i]>d_名称);
其他的
ft_printf(“%-8d%5d%s%s\n”),statbuf.st_gid,
(int)statbuf.st_大小,ft_组(ctime(&statbuf.st_mtime)),
sd[i]>d_名称);
}
免费(sd[i]);
i++;
}
免费(sd);
}
这就是你内存泄漏的原因。您永远不会释放文件名以句点开头的sd元素


另外,我会使用
sd[I]->d_name[0]='.
进行比较<代码>strncmp()对于这一点来说太过分了。循环的固定版本:

for (int i = 0; i < n; i += 1) {
   while (i < n && sd[i]->d_name[0] == '.') {
       free(sd[i++]);
   }
   if (i == n) {
      break;
   }

    // code

    free(sd[i]);
}
free(sd);
for(int i=0;id_name[0]='.){
免费(sd[i++]);
}
如果(i==n){
打破
}
//代码
免费(sd[i]);
}
免费(sd);

此外,这将处理返回的每个文件都是点文件的情况,在这种情况下,原始文件将导致读取超过
sd
数组的末尾。

没有由
stat
创建的泄漏。你认为为什么会有?你使用valgrind了吗?我让程序进入睡眠状态,在我的mac上使用ps命令,然后使用leaks找到leaksman getpwuid:“返回值可能指向一个静态区域”@johnsondubula类似的细节应该在问题本身中。如果你想要递归的线程安全操作,有getpwuid\r()
sd[i]>d\u name[0]=='.
可能是欠压
。例如,bashrc
以句点开头。顺便说一句:
strncmp(sd[i]>d_name,“.”,1)
也有同样的问题,@wildplasser OP说他正在编写一个ls版本,默认情况下会过滤掉点文件。(添加对
-a
选项的支持需要一些琐碎的更改,以避免不值得在此处包含的检查,特别是当主要问题是修复内存泄漏时。)谢谢大家,问题解决了,点文件没有被释放
for (int i = 0; i < n; i += 1) {
   while (i < n && sd[i]->d_name[0] == '.') {
       free(sd[i++]);
   }
   if (i == n) {
      break;
   }

    // code

    free(sd[i]);
}
free(sd);