30

如果 realloc 失败并返回 NULL 是前一个缓冲区被释放还是保持不变?我没有在手册页中找到那条特定的信息,我很不确定该怎么做。如果内存被释放,那么双重释放可能会有风险。如果不是,则将发生泄漏。

4

4 回答 4

31

不,不是的。这方面经常惹恼我,因为你不能只使用:

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.4realloc功能

如果ptr是空指针,则realloc函数的行为类似于malloc指定大小的函数。否则,如果ptr不匹配先前由 、 或 函数返回的指针 callocmalloc或者realloc如果空间已通过调用freeorrealloc函数被释放,则行为未定义。如果无法为新对象分配内存,则不会释放旧对象并且其值不变。

于 2009-10-22T13:01:33.927 回答
5

realloc()返回一个指向新分配内存的指针,该指针适合任何类型的变量对齐,并且可能不同于ptr,或者NULL如果请求失败。如果size等于 0,则返回NULL适合传递给的指针或指针。free()如果realloc()失败,则原始块保持不变;它没有被释放或移动。

malloc(3)- Linux 手册页

于 2009-10-22T12:58:05.913 回答
2

否。如果realloc()失败,则不会更改前一个缓冲区。

男人realloc(3)

realloc()返回一个指向新分配内存的指针,该指针适合任何类型的变量对齐,并且可能不同于ptr,或者NULL如果请求失败。如果 size 等于 0, 则返回NULL适合传递给的指针或指针 。free()如果realloc()失败,则原始块保持不变;它没有被释放或移动。

于 2009-10-22T13:05:43.393 回答
0

不,不会的。Realloc 更改增加/减少通过 malloc 或 calloc 分配的动态内存。如果 realloc 在增加内存时失败,它将返回 NULL,但它不会更改先前分配的内存。由于 Realloc 从先前分配的内存的基地址计算新的内存分配,它不对内存执行任何操作

于 2016-07-02T04:05:01.987 回答