2011-12-28 1 views
2

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

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 печатает все атрибуты и имена узлов, как ожидалось.

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

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

ответ

3
std::vector<char> xmlCopy(bytes.begin(), bytes.end()); 

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

+0

Это имеет смысл, однако я попытался сделать упорный документ и не работал. По крайней мере, это будет продолжаться до тех пор, пока класс, содержащий его, не будет уничтожен, и это точно, что я делаю, насколько я понимаю, это правильно, но еще есть что-то еще. Было бы также полезно знать, есть ли у doc метод clear/clean/reset ... я проверяю его. – notNullGothik

+0

Правильно. Благодаря! – notNullGothik

+0

Этот ответ действительно спас меня, спасибо! У меня была функция, которая взяла строку и ссылку на документ, и мутировала ссылку с помощью функции синтаксического анализа. Проблема заключалась в том, что он разбирался с локальной строкой, которая быстро выпадала из сферы действия. Позже, пройдя по документу, он потерпит неопределенность, когда строка будет окончательно перезаписана в памяти. –