gpt4 book ai didi

c - 如果程序将退出,使用临时 realloc 变量有什么意义?

转载 作者:行者123 更新时间:2023-12-04 03:38:25 25 4
gpt4 key购买 nike

许多人建议执行以下操作来重新分配内存:

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 失败。如果您记录错误并立即退出,则无需使用其他变量来存储结果。如果您在调用链上报告错误,或者您想要进行一些清理,则必须执行此操作。如果您采用第一种方法,则在重构该段代码以返回错误而不是退出时需要小心,因此始终将结果分配给另一个变量有一些优点。

关于c - 如果程序将退出,使用临时 realloc 变量有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66508684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com