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

C语言无法释放所有malloc、realloc分配内存,出现直接内存泄漏问题

问题原因及修复方案

现有代码的核心泄漏点

  • 你给names[0]、names[1]分配完内存后,直接将指针指向了字符串常量"0\0"、"1\0",刚malloc出来的2字节内存的地址直接丢失,永远无法被释放,这是最直接的泄漏来源。而且字符串常量存储在只读内存区,后续如果对这些地址执行free操作,还会触发程序崩溃。
  • realloc本身如果扩容成功会自动释放旧地址的内存,所以只要你正常接收realloc返回值,不需要额外释放realloc之前的names数组本身的内存,但是数组里每个元素指向的字符串内存需要单独释放。

正确的释放逻辑

释放names的内存分两步,完整执行一次即可:

  1. 遍历所有已经分配了字符串内存的names下标,逐个free每个元素指向的内存
  2. 最后再freenames本身的内存
    示例代码:
// 假设当前names数组的总长度是size
for (int i = 0; i < size; i++) {
    // 注意:要先修复names[0]、names[1]的赋值逻辑,不能指向常量,否则这里free会崩溃
    free(names[i]);
}
free(names);
names = NULL; // 可选,避免野指针

其他代码修正建议

  • 给names[0]、names[1]赋值的时候不要直接赋值字符串常量,改用strcpy把内容拷贝到你malloc的内存里:
names[0] = malloc(2 * sizeof(char));
strcpy(names[0], "0"); // 字符串常量自带结束符,不需要额外加\0
names[1] = malloc(2 * sizeof(char));
strcpy(names[1], "1");
  • 接收realloc返回值的时候建议先用临时变量接住,避免realloc失败返回NULL导致原内存地址丢失:
// 错误写法:realloc失败会导致原names地址丢失
// names = realloc(names, size * sizeof(char *));
// 正确写法
char **temp = realloc(names, new_size * sizeof(char *));
if (temp == NULL) {
    // 这里做错误处理,原names内存还在,可以后续释放
    perror("realloc failed");
    return;
}
names = temp;
size = new_size;
  • steps数组的释放逻辑同理:如果struct directive内部没有指针成员,直接free(steps)即可;如果内部还有动态分配的成员,需要先遍历每个元素释放内部成员,再free数组本身。

内容的提问来源于stack exchange,提问作者Gope S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:06:03