1

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

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

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。

谢谢。

4

2 回答 2

2

根据我使用 DOM 类的经验,您不必删除附加到 DOM 树的任何内容。例如,您将子元素附加secondElement到元素firstElement。当后者被释放时,它也将释放secondElement。但是,我在这里看到两件事会泄漏。首先,您不会插入firstElement到 DOM 树中,其次,您不会pDoc在离开时显式删除。您必须释放该元素或将其添加到 DOM 树中,然后在代码中稍后的某个时间点将其删除。

于 2011-04-14T18:39:51.120 回答
1

注意:根据所涉及函数的名称,我假设您在谈论 Xerces-C。

您只需要在树的根部调用release(无论是 DOMElement(删除树的“分支”)还是 DOMDocument(删除整个树))。所以,在最后
添加一个调用pDoc->release();将负责释放文档的内存以及附加到该文档的所有节点。

于 2011-04-14T19:23:49.513 回答