关闭文件时触发free(): double free detected in tcache 2错误求助
解决
free(): double free detected in tcache 2错误的思路 先直接定位代码里的几个核心问题,这些都是触发内存错误的根源:
1. 对NULL指针调用fclose()
在else分支的错误处理逻辑里存在致命问题:
if (json_file == NULL) { *error_msg = malloc(ERR_MSG_LEN); snprintf(*error_msg, ERR_MSG_LEN, "Error reading the json base file\n"); fclose(json_file); // 此处json_file为NULL,调用fclose属于未定义行为 free(base_file_name); return; }
当fopen失败时json_file是NULL,此时调用fclose(NULL)会直接破坏内存管理结构,是引发后续double free报错的直接原因之一。必须删除这行fclose(json_file)。
2. read_file函数的内存管理逻辑存疑
read_file(json_file, &json_string)的实现是关键:
- 要确认该函数的语义:成功时是否为
*json_string分配内存并返回0?失败时是否会自动释放已分配的内存,或者将*json_string置为NULL? - 当前代码中无论
read_file成功与否都直接free(json_string),如果read_file失败时已经释放过json_string,或者json_string未被分配内存就被free,都会触发内存错误。
3. 未初始化指针的free操作
在第一个分支的错误处理中:
if (read_file(json_file, &json_string)) { // ... free(json_string); // ... }
如果read_file失败时json_string还未被分配内存,直接free未初始化的指针属于未定义行为,可能破坏内存池。建议添加if (json_string != NULL)的判断后再执行free。
4. 变量作用域冲突隐患
else分支里重新定义了局部变量FILE *json_file,虽然当前没直接引发问题,但容易导致后续维护时的逻辑混淆,建议复用外层的json_file指针,避免作用域冲突。
调试建议
- 使用内存检测工具(如Linux的
valgrind、GCC/Clang的AddressSanitizer),可以直接定位到具体的重复释放或非法访问位置,比单纯调试指针有效性更高效。 - 在所有
malloc和free操作处添加日志,跟踪json_string、base_file_name的内存地址,确认是否存在重复释放同一地址的情况。
内容的提问来源于stack exchange,提问作者shark_sh
相关产品推荐
相关产品推荐

