【问题标题】:How to free structure xmlSAXHandler from Libxml2 library如何从 Libxml2 库中释放结构 xmlSAXHandler
【发布时间】:2013-07-20 04:23:53
【问题描述】:

我使用 libxml2 库创建了一个 SAX 验证器。

这是我创建它的方法:

void OnStartElementNs(
    void *ctx,
    const xmlChar *localname,
    const xmlChar *prefix,
    const xmlChar *URI,
    int nb_namespaces,
    const xmlChar **namespaces,
    int nb_attributes,
    int nb_defaulted,
    const xmlChar **attributes) {}

void OnEndElementNs(
    void* ctx,
    const xmlChar* localname,
    const xmlChar* prefix,
    const xmlChar* URI) {}

void OnCharacters(void *ctx, const xmlChar *ch, int len) 
{
    char chars[len + 1];
    strncpy(chars, (const char *)ch, len);
    chars[len] = '\0';
}

xmlSAXHandler make_sax_handler ()
{
    xmlSAXHandler SAXHander;

    memset(&SAXHander, 0, sizeof(xmlSAXHandler));

    SAXHander.initialized = XML_SAX2_MAGIC;
    SAXHander.startElementNs = OnStartElementNs;
    SAXHander.endElementNs = OnEndElementNs;
    SAXHander.characters = OnCharacters;

    return SAXHander;
}

xmlSAXHandler mySAXHandler = make_sax_handler();

所以我得到了一个 xmlSAXHandler 对象,如果我想释放内存,我可以单独释放每个变量,比如使用 xmlFree(xmlChar*)。我是 XML 和 libxml2 的新手,所以我想知道是否有一种方便的方法可以释放整个结构。

谢谢!

【问题讨论】:

    标签: c++ c xml libxml2 memory-management


    【解决方案1】:

    您必须自己管理xmlSAXHandler 结构的分配。 libxml2 不提供执行此操作的功能。在您的示例中,您返回一个指向堆栈分配结构的指针。这是行不通的,并且可能会在某些时候使您的程序崩溃。为了使您的代码正常工作,您应该使用malloc 在堆上分配xmlSAXHandler 结构,并在不再需要它时使用free 释放它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2017-08-24
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多