创建仅含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
相关产品推荐
相关产品推荐

