2011-04-14 50 views
1

有关C++中DOM *类createXXX方法的问题。为了释放从DOM * createXXX方法返回的内存,我需要做什么特别的事情吗?DOMDocument C++内存管理

例如(在转码为简化取出并与转码操作相关的增值经销商相关的版本,我知道这些):

pImplement = DOMImplementationRegistry::getDOMImplementation("LS"); 
DOMDocument* pDoc = pImplement->createDocument("Examples", "example", NULL); 
DOMElement* pRoot = pDoc->getDocumentElement(); 

DOMElement* firstElement = pDoc->createElementNS(("Examples", "example"); 
DOMElement* secondElement = pDoc->createElementNS("Examples", "example2"); 

DOMAttr* name = pDoc->createAttribute("Name"); 

XMLCh* somenameValue = XMLString::transcode("Fred"); 
name->setValue(somenameValue); 

secondElement->setAttributeNode(name); 
firstElement->appendChild(secondElement); 

当我离开的方法,最终,我必须对firstElement,secondElement,name使用任何特别的方法来释放createXXX方法中的内存?或者,pdoc拥有所有的内存,我必须等待销毁DOMDocument?

如果增加讨论,我将遍历名称/值逻辑并向secondElement添加多个属性。

谢谢。

回答

1

根据我使用DOM类的经验记忆,您不必删除任何附加到DOM树的东西。例如,您将子secondElement附加到元素firstElement。当后者获得释放时,它也将释放secondElement。但是,我看到两件事会泄漏。首先,您不要将firstElement插入到DOM树中,其次,当您离开时,您没有明确地删除pDoc。您必须释放元素或将其添加到DOM树,并在代码中的某个点删除它。

+0

谢谢。这是我认为,但我们看到一些存储问题与Xerces/Xalan,我想仔细检查。 – 2011-04-15 09:48:52

0

注意:通过所涉及函数的名称,我会假设你在谈论Xerces-C。

你只需要调用release在树的根部(无论是一个一个DOMElement(删除树的只是一个“分支”)或DOM文档(删除整个树))。
因此,添加在最后调用pDoc->release();会照顾到释放文档的内存和所有节点附加该文档。