以下xerces代码是否会导致内存泄漏

will the following xerces code cause a memory leak?

本文关键字:内存 泄漏 xerces 代码 是否 以下      更新时间:2023-10-16

我看了一个在互联网上发现的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();

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

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

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

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

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

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