释放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
相关产品推荐
相关产品推荐

