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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:33:01