DOMDocument C ++内存管理

时间:2011-04-14 18:27:56

标签: c++ xml memory-management domdocument xerces-c

关于C ++中DOM *类createXXX方法的问题。我是否必须做一些特殊的事情来释放从DOM * createXXX方法返回的内存?

例如(为了简化而删除了转码,以及与转码操作相关的变量的相关版本,我知道这些):

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。

感谢。

2 个答案:

答案 0 :(得分:2)

从我使用DOM类的经验记忆中,您不必删除附加到DOM树的任何内容。例如,您将子secondElement追加到元素firstElement。当后者被释放时,它也将释放secondElement。但是,我发现这里有两件事会泄漏。首先,不要将firstElement插入DOM树,其次,当您离开时,不要明确删除pDoc。您必须释放元素或将其添加到DOM树中,然后在代码中的某个位置删除它。

答案 1 :(得分:1)

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

你只需要在树的根上调用release(可以是DOMElement(只删除树的“分支”)或DOMDocument(删除整个树))。 /> 因此,在最后添加对pDoc->release();的调用将负责释放文档的内存以及附加所有节点到该文档。