C语言无法释放所有malloc、realloc分配内存,出现直接内存泄漏问题
问题原因及修复方案
现有代码的核心泄漏点
- 你给
names[0]、names[1]分配完内存后,直接将指针指向了字符串常量"0\0"、"1\0",刚malloc出来的2字节内存的地址直接丢失,永远无法被释放,这是最直接的泄漏来源。而且字符串常量存储在只读内存区,后续如果对这些地址执行free操作,还会触发程序崩溃。 realloc本身如果扩容成功会自动释放旧地址的内存,所以只要你正常接收realloc返回值,不需要额外释放realloc之前的names数组本身的内存,但是数组里每个元素指向的字符串内存需要单独释放。
正确的释放逻辑
释放names的内存分两步,完整执行一次即可:
- 遍历所有已经分配了字符串内存的
names下标,逐个free每个元素指向的内存 - 最后再free
names本身的内存
示例代码:
// 假设当前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.
相关产品推荐
相关产品推荐

