所以这是在运行基于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;
}
答案 0 :(得分:2)
由于您使用realloc
(而不仅仅是malloc
),看起来Data
已经在其他地方分配,可能是在调用my_function
的函数中。要预先清除任何误解,Data = temp;
分配不会将temp
的{{1}}的更新值传递回调用方,因为realloc
按值传递。
现在谈到实际的问题。调用者是否希望 char *Data
释放my_function
缓冲区?如果Data
失败,代码似乎是free
。如果是这样,如果realloc
成功,它也应该free(temp);
。
realloc
成功realloc
,my_function
指针不再必须等于原始temp
,并且原始Data
指针不再符合Data
'的条件,因为它可能指向此处的已解除分配数据。由于重新分配的free
指针是而不是传递回调用函数,因此调用者在temp
返回后尝试free(Data)
是非法的。
总的来说,将(重新)分配的相同级别的内容释放起来总是更安全。依赖于调用者来分配和被调用者处置是有风险的业务,原因不仅仅是这个例子。