如何解决如果程序将退出,使用临时 realloc 变量有什么意义?
许多人建议执行以下操作来重新分配内存:
int *temp=realloc(previousVar,newSize);
if(temp==NULL){
printf("error\n");
exit(-1);
}
previousVar=temp;
我明白,如果没有创建新变量,之前的指针将会丢失,因为 NULL
将被分配给它。但是,如果程序无论如何都会在失败的情况下退出,那么遇到这些麻烦有什么意义?
这是一个堆栈溢出,上面的答案是我所指的: Proper usage of realloc()
解决方法
在您提供的示例中,是否将返回值分配给临时值实际上并不重要。在链接的答案中,作者释放了原始缓冲区,但人们可能会争辩说这没有必要,因为无论如何进程都会退出。
但是,请考虑以下示例:
typedef struct
{
int *values;
size_t capacity;
size_t size;
} MyBuffer;
bool append(MyBuffer *buffer,int value)
{
if (buffer->size == buffer->capacity)
{
// No more space,double the buffer.
size_t new_capacity = buffer->capacity * 2;
int *temp = realloc(buffer->values,new_capacity);
if (temp == NULL)
{
return false;
}
buffer->values = temp;
buffer->capacity = new_capacity;
}
buffer->values[buffer->size] = value;
buffer->size++;
return true;
}
函数 append
尝试向已分配的缓冲区添加新值。如果缓冲区不够大,它会尝试使用 realloc
来获取更大的缓冲区。如果 realloc
失败,函数返回 false
。
如果我们将 realloc
调用更改为直接设置 buffer->values
,我们将在失败的情况下泄漏内存:
buffer->values = realloc(buffer->values,new_capacity);
if (buffer->values == NULL)
{
// Here the original `buffer->values` is lost and we can never access it again.
return false;
}
realloc
不会释放原始缓冲区,因此在失败的情况下我们无法再访问它。这是一个问题:在最好的情况下是内存泄漏,在最坏的情况下我们可能会丢失一些我们仍然需要的数据(除了内存泄漏)。
所以这取决于您如何处理 realloc
失败。如果您记录错误并立即退出,则不需要使用另一个变量来存储结果。如果您在调用链上报告错误,或者您想做一些清理工作,则必须执行此操作。如果您采用第一种方法,您需要小心重构那段代码以返回错误而不是退出,因此始终将结果分配给另一个变量是有好处的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。