2012-06-11 1 views
0

У меня есть этот класс:Weird результат с rapidXml в C++ append_node

// XmlWrapper.h 
class XmlWrapper{ 
private: 
    xml_document<> doc; 
public: 
    XmlWrapper(); 
    string addNode(string node_name); 
      string getXmlString(); 
}; 

// XmlWrapper.cpp 
XmlWrapper::XmlWrapper(){}; 

XmlWrapper::addNode(string node_name){ 
    char _name[name.size()+1]; 
    strcpy(_name,name.c_str()); 
    _name[name.size()] = '\0'; 
    xml_node<> *root = doc.allocate_node(node_element,_name); 
    this->doc.append_node(root); 
    delete root; 
    return SUCCESS; 
} 

string XmlWrapper::getXmlString(){ 
    string xmlString; 
    print(back_inserter(xmlString), this->doc, 0); 
    return xmlString; 
} 

И это мой main.cpp:

XmlWrapper wrapper; 
wrapper.addNode("message"); 
cout << wrapper.getXmlString() << endl; 

Однако мой результат список странных вещей !! если i cout wrapper.getXmlString() в addNode функция, результат будет ОК! Так в чем моя проблема?

Отредактировано: если я использовать непосредственно в main.cpp, как это ниже, каждая вещь идти прямо:

xml_document<> doc; 
xml_node<> *message_node = doc.allocate_node(node_element, "message"); 
doc.append_node(message_node); 
string buffer; 
print(back_inserter(buffer),doc,0); 
cout << buffer << endl; 

Почему эта вещь произойдет?

+0

Вы не используете 'new' для выделения памяти. Почему у вас есть инструкция 'delete root ?' then? Кроме того, для того, чтобы имена узлов были прикреплены, вы, вероятно, должны использовать 'allocate_string'. Прочтите документацию. – dirkgently

+0

Я просто беспокоюсь о утечке памяти! Это правильно? –

+1

Ваш исходный код, который использует вариационный массив '_name', вызовет проблемы с оборванным указателем (когда вы выйдете из функции,' _name' будет уничтожен, а ваш XML-документ укажет на область памяти, которая была уничтожена. – dirkgently

ответ

1

Что говорит dirkgently - _name находится в стеке и будет уничтожено, когда вы выйдете из сферы действия функции. Вы можете использовать allocate_string или написать собственную сборку мусора.

+0

Самая простая сборка мусора будет просто добавление вектора к вашему XmlWrapper и push_back строку в add_node() – ModdyFire

 Смежные вопросы

  • Нет связанных вопросов^_^