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

ja.*_*.ro 28 realloc

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

pax*_*blo 29

不,不是的.这方面经常让我生气,因为你不能只使用:

if ((buff = realloc (buff, newsize)) == NULL)
    return;
Run Code Online (Sandbox Code Playgroud)

在您的代码中,如果您在失败时释放原始文件.相反,你必须做以下事情:

if ((newbuff = realloc (buff, newsize)) == NULL) {
    free (buff);
    return;
}
buff = newbuff;
Run Code Online (Sandbox Code Playgroud)

当然,我理解保持原始缓冲区在失败时保持原样的原理,但我的用例已经弹出足够多,我通常编写自己的函数来处理这种情况,例如:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

C11标准中的相关部分说明(我的斜体):

7.20.3.4 realloc功能

如果ptr是空指针,则该realloc函数的行为类似于malloc指定大小的函数.否则,如果ptr不匹配的指针早些时候返回 calloc,mallocrealloc功能,或如果空间已经到呼叫释放freerealloc功能,该行为是不确定的.如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.


jld*_*ont 5

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

malloc(3) - Linux手册页