DOMDocument C ++ управление памятью - PullRequest
1 голос
/ 14 апреля 2011

Вопрос о методах класса DOM * createXXX в C ++. Нужно ли делать что-то особенное, чтобы освободить память, возвращаемую методами 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?

Если добавить к обсуждению, я перебираю логику имени / значения и добавляю несколько атрибутов ко второму элементу.

спасибо.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

По моему опыту использования классов DOM вам не нужно удалять что-либо, что вы добавляете в дерево DOM.Например, вы добавляете дочерний элемент secondElement к элементу firstElement.Когда последний будет освобожден, он также освободит secondElement.Тем не менее, я вижу здесь две вещи, которые будут течь.Во-первых, вы не вставляете firstElement в дерево DOM, а во-вторых, вы явно не удаляете pDoc, когда уходите.Вы должны либо освободить элемент, либо добавить его в дерево DOM и удалить его в какой-то момент в вашем коде.

1 голос
/ 14 апреля 2011

Примечание: по названию задействованных функций я предполагаю, что вы говорите о Xerces-C.

Вам нужно только вызвать release в корне дерева (будь то DOMElement (чтобы удалить только «ветку» дерева) или DOMDocument (чтобы удалить все дерево)).
Таким образом, добавление вызова к pDoc->release(); в конце позаботится об освобождении памятидокумента и всех узлов , прикрепленных к этому документу.

...