2011-12-08 64 views
0

我以前成功使用xmlTextReaderGetAttribute(从xmlsoft.org),但API文档要求我释放返回的xmlChar*。现在,在第二(第一传递空)我的应用程序崩溃来电free(),如下图所示:xmlTextReaderGetAttribute()后释放xmlChar指针

xmlTextReaderPtr reader = null; 
xmlChar *attribVal = null; 
//blah... 
if (xmlTextReaderAttributeCount(reader) > 0) { 
    free((attribVal)); 

attribVal = xmlTextReaderGetAttribute(reader, (const xmlChar*)"super-Attrib"); 
if (xmlStrcasecmp(attribVal, (const xmlChar*)"monoMega-Attrib") == 0) { 
    free((attribVal)); 

我的项目是在C++中,但libxml2和从xmlsoft.org使用标准C.

+0

这不是你的问题,但你为什么用两套parens编写'free(())'? 什么是你的项目崩溃(段错误?),你可以把打印之前和之后的第二个免费只是为了确保它崩溃吗? – Dan

+0

@丹,我正在通过它与gdb,它正在崩溃在那里。 doube parens(())将施加“const”或“void *”。我有他们在一个函数,直到我发现它崩溃。 – John

回答

6

使用xmlFree()所有示例直接代替free()

xmlTextReaderPtr reader = null; 
xmlChar *attribVal = null; 
//blah... 
if (xmlTextReaderAttributeCount(reader) > 0) 
{ 
    attribVal = xmlTextReaderGetAttribute(reader, BAD_CAST "super-Attrib"); 
    if (attribVal) 
    { 
     ... 
     xmlFree(attribVal); 
    } 
} 
+0

尽管已在'globals.h'中定义并重新定义,是否有延迟加载'xmlFree'的方法? – NobleUplift

+0

根据你在编译libxml时使用的定义,'xmlFree'或者是一个调用'__xmlFree()'的宏,然后将它返回的函数指针解引用,或者它是一个指向'xmlMemFree()'的函数指针变量。或'free()'默认。因此,您必须考虑xmlFree的实际情况,在后一种情况下,您可以延迟加载它实际指向的任何函数(或者将其指向您自己的记忆函数)。 –

+0

非常感谢!我在这个问题上得到了最全面的答案。当我回家时我会尝试。 – NobleUplift