c语言 - 我越来越"pointer being freed was not allocated"



我正在从stdin中读取。因为我不知道我要读取的内容的长度,所以我必须使用malloc。

我得到一个指针被释放,但没有分配

有时在free(final)之前,有时在free(tmp)之前。

在创建指针之后和释放指针之前,我检查两个指针是否正确地是非空的。有人能指出我做错了什么吗?

total_size = 0;
final = (char *)malloc(sizeof(char) * 1);
if (!final)
{
    printf("Error Allocating Memory for finaln");
    return (NULL);
}
while ((ret = read(0, buf, BUF_SIZE)) > 0)
{
    tmp = (char *)malloc(sizeof(char) * ft_strlen(final));
    if (!tmp)
    {
        printf("Error Allocating Memory for tmpn");
        return (NULL);
    }
    strcpy(tmp, final);
    if (final)
        free(final);
    buf[ret] = '';
    total_size = total_size + ret;
    final = (char *)malloc(sizeof(char) * total_size);
    if (!final)
    {
        printf("Error Allocating Memory for finaln");
        return (NULL);
    }
    final = strcat(tmp, buf);
    if (tmp)
        free(tmp);
}
return (final);

这对你来说是个问题:

final = (char *)malloc(sizeof(char) * total_size);

[…]

final = strcat(tmp, buf);

您正在泄漏分配的内存并混淆*final*tmp。此后可以释放其中一个,但在释放另一个之后,必须先将其重新分配给指向一个有效的动态分配块的对象。

总的来说,看起来你用tmp会遇到很多不必要的麻烦。据我所知,你只是想增加final所指向的块的大小,这就是realloc()的作用:

size_t desired_size = total_size + ret + 1;  // need space for a terminator
char *tmp = realloc(final, desired_size);
if (!tmp) {
    perror("Error Allocating More Memory for final");
    // realloc() does not free the pointer on failure; at least GLIBC's doesn't
    free(final);
    return (NULL);
}
final = tmp;
buf[ret] = '';
// strcat is wasteful if you already know the destination string's length
strcpy(final + total_size, buf);
total_size += ret;

重新分配的块可以从原始块的位置开始,也可以不从原始块的位置开始,但是realloc()会在必要时复制数据。

我相信当谈到指针时你会有点困惑。当你写

final = (char *)malloc(sizeof(char) * total_size);

分配相当于sizeof(char) * total_size的内存,然后malloc返回指向该内存的指针。然后继续写

final = strcat(tmp, buf);

返回一个指针。用malloc(...)分配的内存从未使用过。因此,当您之后尝试if (final) free(final);时,您并没有释放已分配的内存。

只是注释

if (final)
    free(final);

final = (char *)malloc(sizeof(char) * total_size);
      if (!final){
          printf("Error Allocating Memory for finaln");
          return (NULL);
      }

删除了双自由错误。希望对大家有所帮助

相关内容

  • 没有找到相关文章

最新更新