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

Should I free() the temporary pointer used to store the result of a realloc()?

所以这是在 x86 机器上 运行 基于 Debian Linux OS。我有以下函数,它被调用了很多次。我不确定我是否应该 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;
}

由于您使用 realloc(不仅仅是 malloc),所以看起来 Data 已经分配到其他地方,大概是在调用 my_function 的函数中。为了预先消除任何误解,Data = temp; 赋值不会将从 realloc 获得的 temp 更新 值传递回调用者,因为 char *Data按值传递。

现在进入实际问题。调用者 是否期望 my_function 释放 Data 缓冲区?如果 realloc 失败,则代码似乎是 free'ing。如果是这样,它可能也应该 free(temp); 如果 realloc 成功。


[ 编辑 ] 为了强调@mksteve 在评论中提出的观点,一旦 reallocmy_function 中成功,temp 指针不再一定等于原始 Data,并且原始 Data 指针不再符合 free 的条件,因为它可能指向此时已释放的数据。由于重新分配的 temp 指针 传递回调用函数,因此调用者在 my_function 之后尝试 free(Data) 是非法的 returns.

总的来说,在开始(重新)分配它们的同一级别释放它们总是更安全。依赖调用者分配和被调用者处置是有风险的业务,原因不仅仅是这个例子。