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

创建仅含NULL的char数组时出现1字节内存泄漏的问题排查

解决char**数组中的1字节内存泄漏问题

这问题其实挺常见的——你看这段代码:

output_s = (char**)malloc(sizeof(char*));
output_s[0] = (char*)malloc(sizeof(char));
output_s[0] = NULL;

你先给output_s[0]分配了1字节内存,紧接着就把它赋值为NULL,这直接把指向那1字节内存的指针给覆盖丢了!后面你执行free(result[0])的时候,其实是在free(NULL)(这在C里是安全操作,但完全没起到释放你之前分配的内存的作用),而原来malloc出来的那1字节,因为没有任何变量保存它的地址了,你根本没法再去free它,自然就出现了Valgrind检测到的内存泄漏。

两种解决方案:

  • 如果这个场景只需要output_s[0]为NULL:那完全没必要提前给它分配内存,直接赋值就行,从根源避免多余的内存分配:
output_s = (char**)malloc(sizeof(char*));
output_s[0] = NULL; // 直接赋值NULL,跳过不必要的malloc

后续执行free(result[0]); free(result);时,free(NULL)是安全的,数组本身也能正常释放,不会有任何泄漏。

  • 如果有其他场景需要给output_s[0]分配内存,仅当前场景要设为NULL:那一定要在赋值NULL之前先释放已经分配的内存,别丢了指针:
output_s = (char**)malloc(sizeof(char*));
output_s[0] = (char*)malloc(sizeof(char));
// 先释放已分配的内存,再赋值NULL
free(output_s[0]);
output_s[0] = NULL;

这样就能把之前分配的1字节内存正常释放,再把指针设为NULL,后续的free操作也能按预期执行。

你看Valgrind的报告里明确指出泄漏来自camelCaser.c第33行的malloc,就是因为那行malloc出来的指针被你后续的= NULL给覆盖了,没机会被free掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:19