1

我查看了我在互联网上找到的 xerces 生成 XML 的示例。Transcode 函数似乎执行了一些编码,但它填充的缓冲区从未被释放。根据文档,您必须手动释放 ti:

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

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

    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();
4

2 回答 2

2

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

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

于 2012-07-31T15:44:22.647 回答
1

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

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

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

您的示例不需要这样做,因为您使用的transcode是返回boolean值的函数。

于 2012-07-31T15:48:45.293 回答