2013-07-20 61 views
2

我使用libxml2庫創建了一個SAX驗證器。如何從Libxml2庫中釋放結構xmlSAXHandler

這裏是我如何創建它:

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對象,如果我要釋放內存,我可以自由saparately每個變量,如使用xmlFree(XMLCHAR *)。我是XML和libxml2的新手,所以我想知道是否有一種方便的方法來釋放整個結構。

謝謝!

回答

0

您必須自己管理xmlSAXHandler結構的分配。 libxml2不提供這樣做的功能。在你的例子中,你返回一個指向堆棧分配結構體的指針。這可能無法正常工作,並可能導致程序崩潰。要使代碼正確工作,您應該使用malloc在堆上分配xmlSAXHandler結構體,並在不再需要時使用free將其釋放。