-1
#include <stdio.h>
#include <stdlib.h>
int main ()
{
    char *buffer=malloc(1);
    char *temporary=malloc(1);
    int length=0;
    signed int character;
    for(length=0;(character = getchar())!=EOF;length++)
    {
        buffer[length]=character;
        if((length==0) || ((length%1000)==0))
        {
            temporary=realloc(buffer,length+1001);
            if(temporary!=NULL)
            {
                buffer= temporary;
            }
            else
            {
                printf("Error: Out of memory!\n");
                free(temporary);
                free(buffer);
                return 1;
            }
        }
    }
    buffer[length]='\0';
    length-=1;
    while(length>=0)
    {
        printf("%c",buffer[length]);
        length--;
    }
    printf("\n");   
    free(buffer);
    //////////////free(temporary); //( HERE)
    return 0;
}

我的程序应该读取一个字符串或一个输入文本文件,存储它,然后将它向后打印出来,这是有效的。我只是不明白为什么我不能free最终获得临时价值。它失败了double free error

我想知道为什么我不能把free(temporary)我写的“这里”放在哪里。

如果您想指出我的代码中的另一个问题,我很高兴学到一些东西。

4

1 回答 1

2

当此代码执行该行时

buffer = temporary;

发生了两件事。首先,持有的内存buffer被“泄露”;你不再有那个地址可以传递给free(). 其次,buffer现在两者都指向由或temporary分配的一块内存。因此,当您调用或时,您已经释放了那块内存;再次调用将是一个双重免费错误。malloc()realloc()free()buffertemporaryfree()

我建议这样的事情:

if (length >= buffer_size)
{
    const size_t new_size = buffer_size + 1000;
    char *temp = realloc(buffer, new_size);
    if (!temp)
    {
        free(buffer);
        /* handle the error in some way */
    }
    buffer = temp;
    buffer_size = new_size;
}

此外,最佳实践是实际检查错误。 malloc()并且realloc()可能失败。

此外,为每个缓冲区分配一个字节的内存也没有多大意义。您不妨从分配 1000 个字节或其他什么开始。

此外,您检查缓冲区是否需要的方式realloc()似乎是不必要的棘手。我建议保留一个变量来跟踪缓冲区的长度,并realloc()在缓冲区不够长时调用,然后在realloc().

编辑:我认为您对temporary. 看看我放的代码,你会看到我把temp变量放在if语句的代码块中。更明显的是多久temp会保持一个有用的值(不是很长)。在外部范围声明temporary,并调用malloc()将一个字节放入其中,只是令人困惑。

于 2013-11-13T00:07:58.063 回答