rapidXML, поврежденная память при обходе дерева DOM - PullRequest
2 голосов
/ 28 декабря 2011

Не понимаю, что происходит с памятью атрибута и rapidXML.Функция инкапсулирует синтаксический анализ XML, в случае успеха возвращает ссылку на корневой узел, при вызове дерева обхода DOM внутри этой функции я получаю правильные данные, хранящиеся в файле XML.

 typedef rapidxml::xml_node<>* Node;
 ...
 Node Load()
 {
     Node pRootNode = NULL;
     // read file stream in bytes
     ...
     std::vector<char> xmlCopy(bytes.begin(), bytes.end());
     xmlCopy.push_back('\0');
     rapidxml::xml_document<> doc;

    try
    {
      doc.parse<rapidxml::parse_declaration_node | rapidxml::parse_no_data_nodes>(&bytes[0]);
      pRootNode = doc.first_node();
          ...
          TraverseDOMTree(pRootNode);
    }
    return pRootNode;
 }

TraverseDOMTree печатает всеатрибуты и имена узлов, как и ожидалось.

Позже, очевидно, вне области Load, pRootNode будет использоваться для запроса значений из DOM-3, это не работает.В целях тестирования вызов TraverseDOMTree, который отлично работал, теперь печатает значения мусора атрибута.Я могу предположить, что дерево DOM все еще там, та же иерархия узлов, что и в первом вызове, но значения атрибутов испорчены.Я попытался сделать глобальный rapidxml :: xml_document <> doc , а также добавить флаг parse_non_destructive , но ни один из них не имеет значения.

Если имеет значение, клиент используетметод Load работает в том же потоке.Что может быть не так?

1 Ответ

3 голосов
/ 28 декабря 2011
std::vector<char> xmlCopy(bytes.begin(), bytes.end());

Локальная копия последовательного представления вашего XML-документа является локальной. Могу поспорить, что rapidXML не копирует атрибуты, а использует указатели на последовательность. Вы можете проверить это, посмотрев адреса значений атрибутов и копию вашего документа.

...