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

XML解析树内存泄漏及大文件内存不足问题求助(附Valgrind日志)

XML解析器内存问题排查

我编写了一款将XML解析为树结构的XMLParser,功能运行正常,但存在内存占用过高的问题——解析4GB大小的XML文件时会因内存不足无法执行。当前的处理流程是先将XML文件转换为char*,再进行解析,并通过malloc为每个Node结构体分配内存。我不清楚何时需要调用free()释放这些节点,甚至不确定是否需要释放,担心释放操作会破坏树结构,同时还收到了Valgrind的内存泄漏报错,具体日志如下:

==3002== HEAP SUMMARY:
==3002==     in use at exit: 8,995 bytes in 423 blocks
==3002==   total heap usage: 427 allocs, 137 frees, 24,691 bytes allocated
==3002== 
==3002== 19 bytes in 1 blocks are indirectly lost in loss record 1 of 8
==3002==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x491460E: strdup (strdup.c:42)
==3002==    by 0x109B9D: parse (main.c:223)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 48 bytes in 1 blocks are indirectly lost in loss record 2 of 8
==3002==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x10934B: new_node (main.c:9)
==3002==    by 0x10A054: main (main.c:332)
==3002== 
==3002== 206 bytes in 32 blocks are definitely lost in loss record 3 of 8
==3002==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x491460E: strdup (strdup.c:42)
==3002==    by 0x1096E9: parse (main.c:108)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 551 bytes in 101 blocks are indirectly lost in loss record 4 of 8
==3002==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x491460E: strdup (strdup.c:42)
==3002==    by 0x1096E9: parse (main.c:108)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 608 bytes in 19 blocks are indirectly lost in loss record 5 of 8
==3002==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x109648: add_attribute (main.c:85)
==3002==    by 0x109DC4: parse (main.c:275)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 1,083 bytes in 134 blocks are indirectly lost in loss record 6 of 8
==3002==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x491460E: strdup (strdup.c:42)
==3002==    by 0x109D13: parse (main.c:255)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 6,432 bytes in 134 blocks are indirectly lost in loss record 7 of 8
==3002==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x10934B: new_node (main.c:9)
==3002==    by 0x109C3A: parse (main.c:238)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== 8,789 (48 direct, 8,741 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 8
==3002==    at 0x484DA83: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3002==    by 0x10934B: new_node (main.c:9)
==3002==    by 0x109B7E: parse (main.c:221)
==3002==    by 0x10A06B: main (main.c:333)
==3002== 
==3002== LEAK SUMMARY:
==3002==    definitely lost: 254 bytes in 33 blocks
==3002==    indirectly lost: 8,741 bytes in 390 blocks
==3002==      possibly lost: 0 bytes in 0 blocks
==3002==    still reachable: 0 bytes in 0 blocks
==3002==         suppressed: 0 bytes in 0 blocks
==3002== 
==3002== For lists of detected and suppressed errors, rerun with: -s

想知道问题的根源,是因为分配了不必要的内存,还是内存释放时机错误?


内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:40:50