如果realloc失败并且返回NULL,那么前一个缓冲区是免费的还是保持原样?我没有在手册页中找到特定的信息,我很不确定该怎么做。如果释放内存,则双重释放可能存在风险。如果没有,则会发生泄漏。
答案 0 :(得分:27)
不,它没有。这方面经常让我感到烦恼,因为你不能只使用:
if ((buff = realloc (buff, newsize)) == NULL)
return;
如果您希望在失败时释放原始文件,请在代码中。相反,你必须做类似的事情:
if ((newbuff = realloc (buff, newsize)) == NULL) {
free (buff);
return;
}
buff = newbuff;
当然,我理解保持原始缓冲区在失败时保持原样的原理,但我的用例已经弹出足够多,我通常编写自己的函数来处理这种情况,例如:
// 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;
}
C11标准中的相关部分(我的斜体):
7.20.3.4
realloc
功能如果
ptr
是空指针,则realloc
函数的行为类似于malloc
函数 指定大小。否则,如果ptr
与之前返回的指针不匹配calloc
,malloc
或realloc
函数,或者如果空间已被呼叫解除分配 对于free
或realloc
函数,行为未定义。如果记忆为新的 无法分配对象,旧对象未取消分配且其值未更改。
答案 1 :(得分:5)
realloc()
返回指向新分配的内存的指针,该内存适用于任何类型的变量,如果请求失败,可能与ptr
或NULL
不同。如果size
等于0,则返回NULL
或适合传递给free()
的指针。如果realloc()
失败,则原始块保持不变;它没有被释放或移动。
答案 2 :(得分:2)
没有。如果realloc()
失败,则不会更改以前的缓冲区。
man
realloc(3)
:
realloc()
返回指向新分配的内存的指针,这是合适的 对齐任何类型的变量,可能与ptr
或NULL
不同 请求失败。如果size等于0,则NULL
或适合的指针 传递给free()
返回。如果realloc()
失败,则保留原始块 不变;它没有被释放或移动。
答案 3 :(得分:0)