动态字符串数组realloc触发double free detected in tcache 2错误求助
排查double free错误的关键提示
- 检查动态数组的容量/计数变量:确认记录数组当前元素数、已分配空间大小的变量在每次添加操作后都正确更新。如果容量计算错误,第三次
realloc可能会操作已经失效的内存地址。 - 检查
realloc的参数与返回值处理:- 绝对不要直接把
realloc结果赋值给原指针(比如arr = realloc(arr, new_size);),如果realloc失败返回NULL会丢失原指针;更关键的是,如果之前的realloc已经移动了内存,你是否在其他地方保留了旧指针的引用? - 确认传递给
realloc的原指针是当前有效的堆指针,不是野指针、已经被回收的地址(哪怕你没手动free,之前的realloc可能已经收回了旧地址)。
- 绝对不要直接把
- 检查字符串内存操作:添加字符串时,是否正确用
malloc/strdup分配了字符串内存?有没有因字符串长度计算错误(比如漏算终止符'\0')导致的越界写入?堆元数据一旦被越界破坏,后续realloc内部的内存管理就会触发double free。 - 检查函数参数传递方式:如果
addend函数要修改动态数组指针,必须传递指针的指针(char ***arr),而非值传递(char **arr)。如果用值传递,函数内部修改的只是指针副本,外部原指针还是旧地址,第三次调用时用旧指针realloc就会触发重复释放——旧地址已被之前的realloc回收。 - 用堆调试工具定位:Linux下执行
valgrind --leak-check=full ./your_program运行程序,它会精准指出内存错误的位置,比如越界写入的具体行、重复释放的地址来源。
内容的提问来源于stack exchange,提问作者ErrorEliminator
相关产品推荐
相关产品推荐

