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

释放realloc返回的空指针是否安全?是否需备份原指针避免内存泄漏

问题结论

你提供的写法一定会导致内存泄漏,必须提前备份原指针的地址。

问题根因

你代码中的判断逻辑if (p = (int *)realloc(p, 2 * sizeof(int *)))存在严重的地址丢失风险:

  • 当realloc分配失败时,会返回NULL,这个返回值会直接覆盖变量p原本存储的原内存块地址
  • C语言标准明确规定realloc分配失败时不会释放原内存块,此时你已经丢失了原内存块的地址,再也无法主动释放这部分内存,就会造成永久性的内存泄漏
  • 后续执行free(p)本质是free(NULL),C标准规定这个操作不会产生任何效果,完全无法挽救泄漏的原内存

正确实现方案

必须用临时指针接收realloc的返回值,确认分配成功后再赋值给原指针:

// 补充说明:你原代码中malloc的参数sizeof(int*)是错误写法,如果是要存储int类型,参数应为sizeof(int)
int *p = malloc(sizeof(int));
if (p == NULL) {
    // 处理malloc失败逻辑,比如报错退出
    perror("malloc failed");
    return 1;
}

// realloc阶段用临时变量接返回值
int *tmp_p = realloc(p, 2 * sizeof(int));
if (tmp_p == NULL) {
    // realloc失败,此时原p指向的内存仍然有效,可根据业务需求选择处理方式:
    // 方式1:不需要继续使用的话,主动释放原内存避免泄漏
    free(p);
    perror("realloc failed");
    return 1;
    // 方式2:如果可以接受继续使用原大小的内存,直接保留p继续使用即可,不需要释放
} else {
    // 分配成功,再把新地址赋值给p
    p = tmp_p;
}

// 后续业务逻辑...

// 使用完毕后统一释放
free(p);

额外注意点

  • C语言中不需要强制转换malloc/realloc的void*返回值,强制转换反而可能掩盖未引入stdlib.h头文件的编译错误
  • 申请内存时注意sizeof的计算对象要和指针指向的存储类型匹配,避免申请空间大小错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:36:02