如果realloc失败并且返回NULL,那么前者缓冲区是免费的还是保持原样?我没有在手册页中找到特定的信息,我很不确定该怎么做.如果释放内存,则双重释放可能存在风险.如果不是,则会发生泄漏.
pax*_*blo 29
不,不是的.这方面经常让我生气,因为你不能只使用:
if ((buff = realloc (buff, newsize)) == NULL)
return;
Run Code Online (Sandbox Code Playgroud)
在您的代码中,如果您想在失败时释放原始文件.相反,你必须做以下事情:
if ((newbuff = realloc (buff, newsize)) == NULL) {
free (buff);
return;
}
buff = newbuff;
Run Code Online (Sandbox Code Playgroud)
当然,我理解保持原始缓冲区在失败时保持原样的原理,但我的用例已经弹出足够多,我通常编写自己的函数来处理这种情况,例如:
// Attempt re-allocation. If fail, free old buffer, return NULL.
static void *reallocFreeOnFail (void *oldbuff, size_t sz) {
void *newbuff = realloc (oldbuff, sz);
if (newbuff == NULL) free (oldbuff);
return newbuff;
}
// Attempt re-allocation. If fail, return original buffer.
// Variable ok is set true/false based on success of re-allocation.
static void *reallocLeaveOnFail (void *oldbuff, size_t sz, int *ok) {
void *newbuff = realloc (oldbuff, sz);
if (newbuff == NULL) {
*ok = 0;
return oldbuff;
}
*ok = 1;
return newbuff;
}
Run Code Online (Sandbox Code Playgroud)
C11标准中的相关部分说明(我的斜体):
7.20.3.4
realloc功能如果
ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数.否则,如果ptr不匹配的指针早些时候返回calloc,malloc或realloc功能,或如果空间已经到呼叫释放free或realloc功能,该行为是不确定的.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.
realloc()返回一个指向新分配的内存的指针,该内存适用于任何类型的变量,可能不同ptr,或者NULL如果请求失败.如果size等于0,则返回任何一个NULL或者适合传递给的指针free().如果realloc()失败,则原始块保持不变; 它没有被释放或移动.