c - 我是否发现了 libxml2 错误(多线程解析中的内存泄漏)?

标签 c memory-leaks openmp libxml2

我实际上正在使用 libxml2 编写数据处理代码.我被困在无法删除的内存泄漏上。这是生成它的最小代码:

#include <stdlib.h>
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <omp.h>

int main(void)
{
    xmlDoc *doc;
    int tn;
    char fname[32];

    omp_set_num_threads(2);
    xmlInitParser();
    #pragma omp parallel private(doc,tn,fname)
    {
        tn  = omp_get_thread_num();
        sprintf(fname,"testdoc%d.xml",tn);
        doc = xmlReadFile(fname,NULL,0);
        printf("document %s parsed on thread %d (%p)\n",fname,tn,doc);
        xmlFreeDoc(doc);
    }
    xmlCleanupParser();

    return EXIT_SUCCESS;
}

在运行时,输出是:

document testdoc0.xml parsed on thread 0 (0x1005413a0)
document testdoc1.xml parsed on thread 1 (0x1005543c0)

确认我们确实拥有多线程并且 doc 在并行区域中确实是私有(private)的。可以注意到我正确地应用了使用 libxml2 ( http://xmlsoft.org/threads.html ) 的线程安全说明。 Valgrind 报告:

HEAP SUMMARY:
    in use at exit: 9,000 bytes in 8 blocks
  total heap usage: 956 allocs, 948 frees, 184,464 bytes allocated

968 bytes in 1 blocks are definitely lost in loss record 6 of 8
   at 0x1000107AF: malloc (vg_replace_malloc.c:236)
   by 0x1000B2590: xmlGetGlobalState (in /opt/local/lib/libxml2.2.dylib)
   by 0x1000B1A18: __xmlDefaultSAXHandler (in /opt/local/lib/libxml2.2.dylib)
   by 0x100106D18: xmlDefaultSAXHandlerInit (in /opt/local/lib/libxml2.2.dylib)
   by 0x100041BE7: xmlInitParserCtxt (in /opt/local/lib/libxml2.2.dylib)
   by 0x100042145: xmlNewParserCtxt (in /opt/local/lib/libxml2.2.dylib)
   by 0x10004615E: xmlCreateURLParserCtxt (in /opt/local/lib/libxml2.2.dylib)
   by 0x10005B56B: xmlReadFile (in /opt/local/lib/libxml2.2.dylib)
   by 0x100000E03: main.omp_fn.0 (in ./xtest)
   by 0x100028FA3: gomp_thread_start (in /opt/local/lib/gcc44/libgomp.1.dylib)
   by 0x1001E8535: _pthread_start (in /usr/lib/libSystem.B.dylib)
   by 0x1001E83E8: thread_start (in /usr/lib/libSystem.B.dylib)

LEAK SUMMARY:
   definitely lost: 968 bytes in 1 blocks
   indirectly lost: 0 bytes in 0 blocks
     possibly lost: 0 bytes in 0 blocks
   still reachable: 8,032 bytes in 7 blocks
        suppressed: 0 bytes in 0 blocks
Reachable blocks (those to which a pointer was found) are not shown.
To see them, rerun with: --leak-check=full --show-reachable=yes

无论使用什么 XML 文档,这对我都有效。我在 Mac OS X 10.6.5 和 gcc 4.4.5 上使用 libxml 2.7.8。

有人能重现这个错误吗?

谢谢,

安东宁

最佳答案

从上面列出的网站 (http://xmlsoft.org/threads.html):

Starting with 2.4.7, libxml2 makes provisions to ensure that concurrent threads can safely work in parallel parsing different documents.

您的示例似乎对每个线程的同一文档 (testdoc.xml) 使用 xmlReadFile。它进一步指出:

Note that the thread safety cannot be ensured for multiple threads sharing the same document, the locking must be done at the application level ...

关于c - 我是否发现了 libxml2 错误(多线程解析中的内存泄漏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4617328/

相关文章:

multithreading - OpenMP:将所有线程分成不同的组

c - 这样写 ptr = &i; 是否合法?在C语言中?

c - 通过添加 0 来分割 c 字符串(段错误)

c - 负复数幂

c - 未定义对 crcsum 的引用(unsigned char const*,unsigned long,unsigned short)

c - 指定线程访问数组中的哪些位置

c - 如何正确释放哈希表上的元素

c# - ASP.NET MVC/WEB API 文件上传 : Memory not being deallocated after upload

java - 设置单独行高时 JTable 内存泄漏

c++ - 访问类数据时替代互斥锁定/解锁