2012-07-31 62 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