二维字符数组内存泄漏排查:fsanitize=address检测到未释放内存
内存泄漏的原因分析及修复方案
第一个泄漏点:被覆盖的malloc内存
初始化myargs[0]时,你先调用malloc分配了内存,但紧接着直接将myargs[0]赋值为command,刚分配的内存地址被完全覆盖,后续无法再访问这块内存,直接造成内存泄漏。第二个核心问题:释放时变量名不匹配
你创建的二维数组变量是myargs,但释放逻辑里全程使用未定义的arr变量——等于完全没对myargs的内层数组和外层数组执行释放操作,这是AddressSanitizer检测到泄漏的主要原因。额外问题:变量重定义(可能引发编译错误)
代码先在数组初始化循环前定义了int i = 1;,后续释放部分又定义int i = 0;,C89标准下会直接编译失败,即便C99支持块级作用域,这种写法也极易引发混淆错误。
修正后的代码示例
struct Item { char* line; struct Item *next; }; void mainMethod(Item *firstArgument) { // 创建二维数组 int r = 5; // r为实际获取到的数值 char **myargs = malloc((r+1)* sizeof(char *)); // 修复:将command内容复制到malloc分配的内存中,不再直接覆盖指针 myargs[0] = malloc((strlen(command)+1) * sizeof(char)); strcpy(myargs[0], command); int i = 1; struct Item* arg = firstArgument->next; for ( ; i < r; i++) { myargs[i] = malloc(((strlen(arg->line)+1)*sizeof(char))); strcpy(myargs[i], arg->line); arg = arg->next; } myargs[i] = NULL; // 业务处理逻辑 ... // 释放二维数组 // 修复变量名,避免重定义变量 int j = 0; while (j <= r) { char* innerArr = myargs[j]; free(innerArr); j++; } free(myargs); }
内容的提问来源于stack exchange,提问作者Gengar
相关产品推荐
相关产品推荐

