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

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的大小,实际分配内存大小不符合预期。

修复方案

  1. 删掉无用的预分配逻辑:你后续所有存储的字符串都是通过strdup分配的,最开始循环给words[a]分配50字节的逻辑完全多余,直接删除即可解决250字节泄漏。
  2. 补充释放words本身:在最后free(input);之前,添加free(words);释放最开始分配的指针数组,解决8000字节泄漏。
  3. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:03