如果失败,realloc会释放前缓冲区吗?

时间:2009-10-22 12:56:06

标签: realloc

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

4 个答案:

答案 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与之前返回的指针不匹配   callocmallocrealloc函数,或者如果空间已被呼叫解除分配   对于freerealloc函数,行为未定义。如果记忆为新的   无法分配对象,旧对象未取消分配且其值未更改。

答案 1 :(得分:5)

  

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

malloc(3) - Linux man page

答案 2 :(得分:2)

没有。如果realloc()失败,则不会更改以前的缓冲区。

  

man realloc(3)

     

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

答案 3 :(得分:0)

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