无法在 C 中释放重新分配的内存

哈菲兹·铁木里

在我尝试释放分配的内存之前,我的代码运行良好。malloc编辑了files指针,后来我用来realloc增加大小。但是当我尝试释放内存时,它给了我无效的指针错误,不知道为什么。

char *files = malloc(1);
char *temp = strdup(argv[i]);
strcat(temp, "/");
strcat(temp, dp->d_name);
DIR *child_dir;
child_dir = opendir (temp);

if (child_dir == NULL) {
    files = realloc(files, strlen(dp->d_name)+1);
    strcat(files, dp->d_name);
    strcat(files, "/");
} else {
    struct dirent *child_dp;
    while ((child_dp = readdir (child_dir)) != NULL) {
        if (!strcmp(child_dp->d_name, ".")
            || !strcmp(child_dp->d_name, ".."))
                continue;

        files = realloc(files, strlen(child_dp->d_name) + 1);
        strcat(files, child_dp->d_name);
        strcat(files, "/");
    }
}
close(fd[0]);
int n = write(fd[1], files, strlen(files));
free(temp); // free
free(files); // free
temp = NULL;
files = NULL;
return;

这是我得到的错误,

======= Backtrace: =========
/lib64/libc.so.6(+0x721af)[0x7fa2e697c1af]
/lib64/libc.so.6(+0x77706)[0x7fa2e6981706]
/lib64/libc.so.6(+0x78453)[0x7fa2e6982453]
./myfind[0x40110c]
./myfind[0x400b02]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7fa2e692a6e5]
./myfind[0x400a09]
======= Memory map: ========

注意:如果我在不释放任何内存空间的情况下运行相同的代码,它工作正常。这意味着指针指向内存中的正确位置。

暗影游侠

您正在使用以下代码破坏您的堆:

char *temp = strdup(argv[i]);
strcat(temp, "/");
strcat(temp, dp->d_name);

strdup 只为它正在复制的字符串分配足够的空间,但您随后将更多的空间连接到末尾,而无需重新分配以腾出空间。

NUL当您realloc files处于这种if情况时,您也不会为终止符留出空间,尽管在大多数情况下您会侥幸逃脱(尽管您应该分配正确的数量)。

最后,在案例while循环中else,每个realloc只为您添加的内容分配足够的空间,但不会为已经存在的内容留出空间(同样,没有为NUL终止符留出空间)。反复滥用保证了一段时间后堆损坏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在c中重新分配char **的内存

来自分类Dev

在c中重新分配char **的内存

来自分类Dev

C - 数组中内存的重新分配

来自分类Dev

内存重新分配C ++

来自分类Dev

无法重新分配C结构数组

来自分类Dev

无法在C中释放内存

来自分类Dev

无法在C中释放内存

来自分类Dev

重新分配的内存比最初为C中的指针少

来自分类Dev

重新分配内存在c中不起作用

来自分类Dev

重新分配内存在c中不起作用

来自分类Dev

realloc()无法重新分配内存

来自分类Dev

重新分配内存并在C中的重新分配的内存空间中添加字符串

来自分类Dev

C ++类数组内存重新分配

来自分类Dev

重新分配的内存少于最初为C中的指针分配的内存

来自分类Dev

在具有并行任务的Mono / C#中无法释放内存。如何解释分配?

来自分类Dev

无法重新分配双指针动态内存

来自分类Dev

删除静态/动态指针后无法重新分配内存

来自分类Dev

无法在C:\ wamp \ www \ zr \ core \ functions \ users.php中重新分配自动全局变量_POST

来自分类Dev

在 C# 中重新分配数组时内存会发生什么?

来自分类Dev

在C ++中重新分配多维数组

来自分类Dev

C ++向量动态内存重新分配/删除

来自分类Dev

C ++向量动态内存重新分配/删除

来自分类Dev

C ++ 4D数组内存重新分配很慢

来自分类Dev

在C中循环分配和释放内存

来自分类Dev

释放C中动态分配的内存

来自分类Dev

在C中释放已分配的内存

来自分类Dev

C中的Free()函数在释放重新分配的数据时不会产生任何错误,但不会释放实际内容。可能是什么原因?

来自分类Dev

C:重新分配的行为方式我无法弄清楚为什么

来自分类Dev

无法在ClipboardManager primaryClip中重新分配Val

Related 相关文章

热门标签

归档