Странный результат с 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;

Тем не менее, мой результат представляет собой список странных вещей!! если я вызову 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;

Почему это происходит?


person Kingfisher Phuoc    schedule 11.06.2012    source источник
comment
Вы не используете new для выделения памяти. Почему тогда у вас есть оператор delete root;? Кроме того, чтобы имена узлов приклеились, вам, вероятно, следует использовать allocate_string. Прочтите документацию.   -  person dirkgently    schedule 11.06.2012
comment
Я просто беспокоюсь об утечке памяти! Это правильно?   -  person Kingfisher Phuoc    schedule 11.06.2012
comment
Ваш исходный код, использующий вариативный массив _name, вызовет проблемы с оборванным указателем (когда вы выйдете из функции, _name будет уничтожен, а ваш XML-документ будет указывать на область памяти, которая была уничтожена.   -  person dirkgently    schedule 11.06.2012
comment
Итак, я должен объявить _name указателем? Есть ли другой способ сохранить xml в тип документа :-?   -  person Kingfisher Phuoc    schedule 11.06.2012
comment
Я бы предложил использовать allocate_string, предоставленный библиотекой.   -  person dirkgently    schedule 11.06.2012


Ответы (1)


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

person ModdyFire    schedule 12.06.2012
comment
Самая простая сборка мусора будет состоять в том, чтобы просто добавить элемент vector‹string› в ваш XmlWrapper и отодвинуть строку в add_node(). - person ModdyFire; 12.06.2012