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
相关产品推荐
相关产品推荐

