C语言calloc分配二维int数组触发Valgrind内存泄露问题排查
问题根因分析
你代码的核心错误出现在realloc扩容后的指针赋值逻辑,直接导致了内存泄漏和重复释放两个问题:
- 无效释放报错来源:你在
realloc拿到temp指针后,通过循环for (size_t k = i; k < initial_row; k++)将同一块内存的指针赋值给了arr[i]到arr[initial_row-1]的所有行指针,导致多个行指针指向同一块堆内存。最终释放时,第一遍free(arr[0])已经把这块内存释放,后续free(arr[1])等操作就是释放已经被回收的内存,触发valgrind的无效释放报错。 - 12字节内存泄漏来源:初始化阶段你给每一行单独
calloc了COL=3个int的内存(3*4=12字节),当i=0触发扩容逻辑时,arr[1]原本指向的12字节内存的指针被新的temp指针覆盖,没有任何指针再指向这块原始内存,也就无法被释放,最终形成12字节的明确泄漏。
修复思路
你的后续定位是正确的,动态int二维数组的每一行都是独立的堆内存块,扩容时需要为每一行单独调用内存分配函数,不能将同一块内存的指针赋值给多个行元素。如果需要所有行同步扩容,正确逻辑应该是遍历所有行,对每一行单独执行realloc操作,不要共用同一个返回指针。
内容的提问来源于stack exchange,提问作者Kristina Pianykh
相关产品推荐
相关产品推荐

