2012-07-31 63 views
1

我看了一个例子,我在互联网上发现了xerces生成XML。 Transcode函数似乎执行一些编码,但它填充到的缓冲区永远不会被释放。根据文档,您必须手动发布ti:下面的xerces代码会导致内存泄漏吗?

注意:返回的缓冲区是动态分配的,并且调用方负责在不再需要时删除它。你可以调用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(); 

回答

1

原谅我,如果我误解了,但你使用有不actutally创建或返回任何缓冲区transcode的版本,因为它修改的地方您提供的是一个(tempStr) 。您的示例代码不会泄漏内存。

返回缓冲区的transcode版本(例如,除了在你的示例代码块的那些所有其他版本)使用MemoryManager实例来进行分配。这里的文档看起来有点稀疏,但据我所知,默认XMLPlatformUtils::fgMemoryManager没有声明清除它分配的任何内存。因此,你应该假设你需要自己销毁返回的缓冲区。

1

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

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

您的例子并不需要做的这是因为您正在使用transcode函数,该函数返回boolean值。

+0

因此,如果我调用两次相同的缓冲区上的转码,只有一次调用释放它会导致内存泄漏? – godzilla 2012-07-31 16:00:23

+0

@godzilla:在你的例子中,你不需要担心释放缓冲区。你的缓冲区'tempStr [100]'被分配在**栈**上。一旦这个函数超出范围,缓冲区将被释放。 – 2012-07-31 16:02:14

+0

@godzilla:我也更新了我的答案,以澄清事情。 – 2012-07-31 16:03:23