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

时间:2017-10-14 00:38:45

标签: c heap-memory realloc heap-corruption

我的代码工作正常,直到我尝试释放分配的内存。我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: ========

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

1 个答案:

答案 0 :(得分:2)

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

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

strdup只为它复制的字符串分配足够的空间,但是你可以在不重新分配的情况下将更多内容连接到最后,以腾出空间。

在[{1}}条件NUL realloc时,您还没有为files终结者留出空间,但在大多数情况下,您可以侥幸逃脱(你应该分配正确的金额)。

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