首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果失败,realloc会释放前一个缓冲区吗?

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

Stack Overflow用户
提问于 2009-10-22 20:56:06
回答 4查看 9.3K关注 0票数 30

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

EN

回答 4

Stack Overflow用户

发布于 2009-10-22 21:01:34

不,它不是。这方面经常让我恼火,因为你不能简单地使用:

代码语言:javascript
复制
if ((buff = realloc (buff, newsize)) == NULL)
    return;

在你的代码中,如果你想在失败时释放原始文件。取而代之的是,你必须这样做:

代码语言:javascript
复制
if ((newbuff = realloc (buff, newsize)) == NULL) {
    free (buff);
    return;
}
buff = newbuff;

当然,我理解在失败时保持原始缓冲区完好无损的基本原理,但我的用例已经足够多,以至于我通常编写自己的函数来处理这种情况,例如:

代码语言:javascript
复制
// 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与先前由callocmallocrealloc函数返回的指针不匹配,或者如果空间已通过调用freerealloc函数释放,则行为是未定义的。如果无法为新对象分配内存,则不会释放旧对象,并且其值保持不变。

票数 31
EN

Stack Overflow用户

发布于 2009-10-22 20:58:06

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

malloc(3) - Linux man page

票数 5
EN

Stack Overflow用户

发布于 2009-10-22 21:05:43

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

man realloc(3)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1607004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档