C程序已释放calloc分配内存仍存在内存泄漏问题咨询
内存泄漏问题原因及修复方案
核心泄漏点说明
- 第一个8000字节泄漏:你最开始通过
calloc为words指针数组分配了内存,但最后只释放了words指向的每个字符串内存,没有释放words本身。 - 第二个250字节泄漏:你预先循环为
words的每个元素malloc了50字节内存,但后续直接用strdup的返回值覆盖了words[count]的指针,导致被覆盖位置的预分配内存地址丢失,无法被释放,出现泄漏。你报错里的250字节正好是5块50字节的内存,对应你实际输入了5行内容,前5个words元素的预分配内存都被覆盖丢失。 - 额外隐患:
char *input = calloc(1000, sizeof(input));写法错误,sizeof(input)取的是指针的大小(64位系统下为8字节),不是char的大小,实际分配内存大小不符合预期。
修复方案
- 删掉无用的预分配逻辑:你后续所有存储的字符串都是通过
strdup分配的,最开始循环给words[a]分配50字节的逻辑完全多余,直接删除即可解决250字节泄漏。 - 补充释放
words本身:在最后free(input);之前,添加free(words);释放最开始分配的指针数组,解决8000字节泄漏。 - 修正
input的分配参数:改为char *input = calloc(100, sizeof(char));即可,匹配你fgets读取的最大长度100。
修复后关键代码示例
int main(int argc, char* argv[]) { char **words = calloc(1000, sizeof(*words)); // 删除原来的预分配for循环 char *input = calloc(100, sizeof(char)); int count = 0; // 原有业务逻辑不变 while (1) { if (fgets(input, 100, stdin) == NULL) { break; } words[count] = strdup(input); count++; } // 原有统计打印逻辑不变 // 释放逻辑修改 for (int a = 0; a < count; ++a) { // 不用循环1000次,只需要释放实际有strdup的count个即可 free(words[a]); } free(words); // 补充释放words本身 free(input); return 0; }
内容的提问来源于stack exchange,提问作者Vearaa
相关产品推荐
相关产品推荐

