如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我很不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果不是,则将发生泄漏。
4 回答
不,不是的。这方面经常惹恼我,因为你不能只使用:
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
orrealloc
函数被释放,则行为未定义。如果无法为新对象分配内存,则不会释放旧对象并且其值不变。
realloc()
返回一个指向新分配内存的指针,该指针适合任何类型的变量对齐,并且可能不同于ptr
,或者NULL
如果请求失败。如果size
等于 0,则返回NULL
适合传递给的指针或指针。free()
如果realloc()
失败,则原始块保持不变;它没有被释放或移动。
否。如果realloc()
失败,则不会更改前一个缓冲区。
男人
realloc(3)
:
realloc()
返回一个指向新分配内存的指针,该指针适合任何类型的变量对齐,并且可能不同于ptr
,或者NULL
如果请求失败。如果 size 等于 0, 则返回NULL
适合传递给的指针或指针 。free()
如果realloc()
失败,则原始块保持不变;它没有被释放或移动。
不,不会的。Realloc 更改增加/减少通过 malloc 或 calloc 分配的动态内存。如果 realloc 在增加内存时失败,它将返回 NULL,但它不会更改先前分配的内存。由于 Realloc 从先前分配的内存的基地址计算新的内存分配,它不对内存执行任何操作