如何从 Libxml2 库中释放结构 xmlSAXHandler

How to free structure xmlSAXHandler from Libxml2 library

本文关键字:释放 结构 xmlSAXHandler Libxml2      更新时间:2023-10-16

我使用 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] = '';
}
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的新手,所以我想知道是否有一种方便的方法来释放整个结构。

谢谢!

您必须自己管理xmlSAXHandler结构的分配。 libxml2 不提供函数来做到这一点。在您的示例中,您将返回指向堆栈分配结构的指针。这不起作用,并且可能会使您的程序在某个时候崩溃。若要使代码正常工作,应使用 malloc 在堆上分配 xmlSAXHandler 结构,并在不再需要时使用 free 释放它。