2

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

谢谢!

4

1 回答 1

0

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

于 2013-09-22T12:46:43.287 回答