2012-06-11 22 views
0

我有這個類:與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; 

然而,我的結果是奇怪的事情列表!如果我在addNode函數中輸入wrapper.getXmlString(),結果就okie!那麼我的問題是什麼?

編輯: 如果我在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'語句呢?此外,對於節點名稱的粘貼,你應該使用'allocate_string'。閱讀文檔。 – dirkgently

+0

我只是擔心內存泄漏!這是正確的嗎? –

+1

您使用可變數組'_name'的原始代碼會導致懸掛指針的問題(當您離開函數時,'_name'將被銷燬,您的XML文檔將指向已被銷燬的內存區域。 – dirkgently

回答

1

什麼dirkgently說 - _name是在堆棧上,並將退出功能的範圍時被銷燬。你可以使用allocate_string,或者編寫你自己的垃圾回收。

+0

最簡單的垃圾回收將只是將矢量成員添加到您的XmlWrapper,並在add_node()中push_back該字符串 – ModdyFire