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

What is the point of using a temporary realloc variable, if the program will exit?

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

int *temp=realloc(previousVar,newSize);
if(temp==NULL){
 printf("error\n");
 exit(-1);
}
previousVar=temp;

我明白,如果没有创建新变量,之前的指针就会丢失,因为 NULL 会被分配给它。但是,如果程序无论如何都会在失败的情况下退出,那么麻烦有什么意义呢?

这是一个堆栈溢出问题,其中最上面的答案就是我所指的内容: Proper usage of realloc()

在您提供的示例中,是否将 return 值分配给临时值并不重要。在链接的答案中,作者释放了原始缓冲区,但有人可能会争辩说没有必要,因为该过程无论如何都会退出。

但是,请考虑以下示例:


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