You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中realloc()返回NULL时是否需要释放原内存?

realloc()返回NULL时的内存释放规则

你的判断不对,核心错在对realloc()失败场景的行为理解有偏差。

别靠「原地调整/搬迁新地址」两个执行分支倒推失败逻辑,直接记C标准定死的realloc()行为规则就行,非常清晰:

  • 调用成功(返回非NULL指针)时:
    • 要是原地址周边有足够空间能直接调整大小,就返回和旧指针一模一样的地址,旧内存不用单独释放,最后统一释放返回的指针就完事。
    • 要是原地址空间不够,就先申请一块符合大小要求的新内存,把旧内存里的内容完整拷贝过去,自动释放掉旧内存块,再返回新块的地址,这种情况最后也只需要释放返回的新指针就行。
  • 调用失败(返回NULL)时:
    不管realloc()本来打算原地调整还是搬去新地址,只要返回NULL,你传进去的旧指针指向的内存块一点都不会动,也绝对不会被自动释放,这块内存还是归你管,必须手动释放,不然就会造成内存泄漏。

你之前想的「搬迁新地址场景下如果返回NULL,旧内存已经被自动释放」是很多人都踩过的坑:realloc()尝试搬迁的时候,执行顺序是「先申请新内存→新内存申请成功了,才会拷贝内容、释放旧内存→返回新地址」,要是新内存申请失败,直接就返回NULL了,根本轮不到释放旧内存这一步,完全不存在旧内存被自动释放的可能。

你写的示例代码逻辑反而是对的:

int *a = (int*)malloc(sizeof(int));
int *b = (int*)realloc(a,sizeof(int)*3);

if(!b){
   free(a);
   // 这里可以加对应的错误处理,比如打日志、走异常分支
} else {
   a = b; // 确认申请成功再更新原指针,避免把原地址弄丢
}

顺带提一个最常见的错误写法:千万别直接把realloc()的返回值赋值给原指针,也就是别写a = realloc(a, new_size)。要是这时候realloc()返回NULL,原指针a直接被覆盖成NULL,你手里再也没存之前那块有效内存的地址,连释放都找不到入口,直接造成无法挽回的内存泄漏。


内容的提问来源于stack exchange,提问作者Elrisas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:18:18