内存分配问题

时间:2013-11-12 23:53:04

标签: c free dynamic-memory-allocation

#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)放在我写“这里”的地方。

如果你想在我的代码中指出另一个问题,我很乐意学习一些东西。

1 个答案:

答案 0 :(得分:2)

当此代码执行行

buffer = temporary;
发生了两件事。首先,buffer持有的记忆被“泄露”;您不再需要将该地址传递给free()。其次,buffertemporary现在都指向由malloc()realloc()分配的单个内存。因此,当您在free()buffer上调用temporary时,您已释放了大块内存;再次致电free()将是双重免费错误。

我建议这样的事情:

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()将一个字节放入其中,这只会令人困惑。