我应该free()用于存储realloc()结果的临时指针吗?

时间:2015-12-05 07:36:32

标签: c linux pointers free realloc

所以这是在运行基于Debian的Linux操作系统的x86机器上。我有很多次被称为的以下功能。我不确定是否应free()使用temp指针,或者我可以让函数保持原样。

int my_function (char *Data, int Data_size) {

    void *temp;
    Data_size = 7000;

    // Allocate a huge array to store a line of the datalogger
    //
    temp = (char *) realloc( Data, Data_size);
    if (temp == NULL)
    {
        printf("Reallocate Data ERROR\n");
        free(Data);
        return -1;
    }
    Data = temp;

    // Do something with the Data

    return 1;
}

1 个答案:

答案 0 :(得分:2)

由于您使用realloc(而不仅仅是malloc),看起来Data已经在其他地方分配,可能是在调用my_function的函数中。要预先清除任何误解,Data = temp;分配不会将temp的{​​{1}}的更新值传递回调用方,因为realloc按值传递。

现在谈到实际的问题。调用者是否希望 char *Data释放my_function缓冲区?如果Data失败,代码似乎是free。如果是这样,如果realloc成功,它也应该free(temp);

<小时/> [编辑]为了强调@mksteve在评论中提出的观点,一旦realloc成功reallocmy_function指针不再必须等于原始temp,并且原始Data指针不再符合Data'的条件,因为它可能指向此处的已解除分配数据。由于重新分配的free指针是而不是传递回调用函数,因此调用者在temp返回后尝试free(Data)是非法的。

总的来说,将(重新)分配的相同级别的内容释放起来总是更安全。依赖于调用者来分配和被调用者处置是有风险的业务,原因不仅仅是这个例子。