如果realloc失败并返回NULL,是前一个缓冲区已释放还是保持完好?我没有在手册页中找到这条特定的信息,我不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果不是,那么就会发生泄漏。
发布于 2009-10-22 21:01:34
不,它不是。这方面经常让我恼火,因为你不能简单地使用:
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标准中的相关部分说明(我的斜体):
realloc
7.20.3.4 The function
如果ptr为空指针,则对于指定的大小,realloc函数的行为类似于malloc函数。否则,如果ptr与先前由calloc、malloc或realloc函数返回的指针不匹配,或者如果空间已通过调用free或realloc函数释放,则行为是未定义的。如果无法为新对象分配内存,则不会释放旧对象,并且其值保持不变。
发布于 2009-10-22 20:58:06
realloc()返回一个指向新分配的内存的指针,该指针适用于任何类型的变量,可能不同于ptr,如果请求失败,则返回NULL。如果size等于0,则返回NULL或适合传递给free()的指针。如果realloc()失败,则原始块保持不变;它不会被释放或移动。
发布于 2009-10-22 21:05:43
不是的。如果realloc()失败,则不会更改以前的缓冲区。
man
realloc(3):
realloc()返回一个指向新分配的内存的指针,该指针适用于任何类型的变量,可能不同于ptr,如果请求失败,则返回NULL。如果size等于0,则返回NULL或适合传递给free()的指针。如果realloc()失败,原始块保持不变;它不会被释放或移动。
https://stackoverflow.com/questions/1607004
复制相似问题