【问题标题】:Should I free() the temporary pointer used to store the result of a realloc()?我应该释放()用于存储 realloc()结果的临时指针吗?
【发布时间】:2016-03-10 05:18:57
【问题描述】:

所以这是在运行基于 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;
}

【问题讨论】:

  • 你不应该。 free() 用于告诉操作系统您不再使用具有给定地址的内存。既然你把那块内存给了“数据”,你就不应该释放它。但是,当您在程序的某些部分停止使用“数据”时,您应该调用free()
  • 嘿,谢谢。因此,如果我在函数内使用“数据”并且不再需要它,我应该在退出函数之前释放(数据)和释放(临时)?
  • Data 是一个指针, temp 也是一个指针,它们指向同一个内存块,所以你不需要释放它们。当函数完成时, temp 将被销毁,但它指向的数据将在内存中保持活动状态。由于 Data 指向该内存块,因此只有在使用完 Data 后才应调用 free()
  • 此代码泄漏内存。 Data = temp; 不会告诉调用代码有关 temp 的任何信息。 C 使用按值传递。

标签: c linux pointers free realloc


【解决方案1】:

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

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


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

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

【讨论】:

  • 是的,你应该释放它,因为原始值被 realloc 破坏(Data 的原始值将是freeed)并且新值丢失 - 不会离开函数
  • 只是为了清楚。因此,如果调用者希望函数在出现错误时释放 Data 缓冲区。如果 realloc 失败,我应该 free(Data),如果 realloc 成功,我应该 free(temp)。还有一件事,这是正确的做事方式还是有更安全的方式来处理这种类型的内存分配?
  • should free(Data) if realloc fail and free(temp) if realloc is successful. 没错。另一点是Data 是按值传递的,因此调用者不会收到重新分配的指针。调用者函数绝对不能在my_function 返回后尝试以任何方式使用数据指针。
  • is there a more secure way of handling this type of memory allocation。例如,您可以更改 my_function 以返回 char * 并让它实际返回重新分配的 temp 指针。这样,调用者将有机会接收新重新分配的指针的值,如果需要进一步使用它。
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2010-09-14
  • 2018-11-10
  • 2021-11-04
  • 2010-12-25
  • 2015-03-11
相关资源
最近更新 更多