如果程序将退出,使用临时 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 一个错误而不是退出,所以总是将结果分配给另一个变量是有一些好处的。
许多人建议执行以下操作来重新分配内存:
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 一个错误而不是退出,所以总是将结果分配给另一个变量是有一些好处的。