以下xerces代码会导致内存泄漏吗?

时间:2012-07-31 15:33:52

标签: c++ xerces xerces-c

我看了一下我在互联网上发现的生成XML的xerces的例子。 Transcode函数似乎执行某些编码,但它填充的缓冲区永远不会释放。根据文档,您必须手动释放ti:

  

注意:返回的缓冲区是动态分配的,调用者有责任在不再需要时删除它。您可以调用XMLString :: release来释放此返回的缓冲区。

可以doc->释放从内存释放吗?

    XMLCh tempStr[100];

    XMLString::transcode("Range", tempStr, 99);
    DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(tempStr, 0);

    XMLString::transcode("root", tempStr, 99);
    DOMDocument*   doc = impl->createDocument(0, tempStr, 0);
    DOMElement*   root = doc->getDocumentElement();

    XMLString::transcode("FirstElement", tempStr, 99);
    DOMElement*   e1 = doc->createElement(tempStr);
    root->appendChild(e1);

    XMLString::transcode("SecondElement", tempStr, 99);
    DOMElement*   e2 = doc->createElement(tempStr);
    root->appendChild(e2);
    doc->release();

2 个答案:

答案 0 :(得分:1)

如果我误解了,请原谅我,但你在那里使用的transcode版本并没有在行为上创建或返回任何缓冲区,因为它正在修改你提供的缓冲区({{1} }) 到位。您的示例代码不会泄漏内存。

tempStr版本返回缓冲区(例如,除示例代码块中的版本之外的所有其他版本)使用transcode实例执行分配。这里的文档似乎有点稀疏,但据我所知,默认MemoryManager没有声称要清理它已经分配的任何内存。因此,您应该假设您需要自己销毁该返回的缓冲区。

答案 1 :(得分:1)

不,doc->release()没有释放缓冲区。

正如您引用的文档所述,如果您正在调用返回转码字符串的XMLString::release()函数,则 需要使用transcode释放缓冲区:

char *str = XMLString::transcode(someStringVarToBeTranscoded);
XMLString::release(&str);

您的示例不需要执行此操作,因为您使用的transcode函数返回boolean值。