2014-04-17 56 views
0

我想創建一個配置類,它使用rapidxml從xml讀取數據。 因此,我有一個私人xml_document我構造的內部解析:從其他類調用此方法創建違規讀取

class Config 
{ 
public: 
    Config(); 
    ~Config(); 
    /*returns the first found node*/ 
    xml_node<>* findNode(const char* name); 
    /*get an configuration value. It's always a char*/ 
    char* getConfigValue(const char* name); 

private: 
    rapidxml::xml_document<>* m_doc; 
}; 

//cpp 
Config::Config() 
{ 
    m_doc = new xml_document<>(); 
    rapidxml::file<> xmlFile("config.xml"); 
    m_doc->parse<0>(xmlFile.data()); 
    //LOG(getConfigValue("width")); // here it works 
} 
xml_node<>* Config::findNode(const char* name) 
{ 
    return m_doc->first_node()->first_node(name); 
} 
char* Config::getConfigValue(const char* name){ 
    return m_doc->first_node()->first_node(name)->value(); 
} 

裏面的wWinMain的我創建一個配置opject並嘗試調用的方法。

Config* config = new Config(); 
LOG(config->findNode("width")->value()); // this does create violation reading 

但是如果我把同一行放到Config類的構造函數中,它沒有任何問題。這裏出了什麼問題?

+0

它看起來像你沒有初始化'm_doc'任何地方。 – user657267

+0

如果將'm_doc = new xml_document <>();'添加到ctor,則doenst會更改內容。 – BennX

+1

也許不是'm_doc'在你使用它之前,仍然需要指向一些東西。 – user657267

回答

2

我不熟悉XML迅速,但快速谷歌搜索告訴我:

http://rapidxml.sourceforge.net/manual.html

RapidXml是原位解析器,這使得它能夠實現非常高的 解析速度。原位意味着解析器不會複製 字符串。相反,它將指針指向DOM 層次結構中的源文本。

3.1終身源文本

在原位解析要求源文本住至少只要 文檔對象。如果源文本被破壞,DOM樹中 節點的名稱和值也將被銷燬。此外,空白處理,字符實體轉換和字符串零終止要求在解析期間(但參見非破壞性模式)修改源文本 。這使得文本 一旦由RapidXml解析,就無法進一步處理。

所以我從什麼是你不能只是有rapidxml ::文件<> XMLFILE( 「config.xml文件」);是一個棧變量,因爲xml_document-> parse()將創建一個直接指向xmlFile內存的樹。所以xmlFile必須在內存中至少和xml_document一樣長,否則你將有無效的數據。這意味着xmlFile需要是您的Config類的成員。另外,我沒有看到你初始化m_doc,你是否忽略了一些代碼?否則,它應該早點抱怨,永遠不會工作。此外,您應該始終檢查以確保返回指針的函數在訪問它們之前不會返回null,以避免讀取違規。

所以,你真正想要的是這樣的:

class Config 
{ 
public: 
    Config(); 
    ~Config(); 
    /*returns the first found node*/ 
    xml_node<>* findNode(const char* name); 
    /*get an configuration value. It's always a char*/ 
    char* getConfigValue(const char* name); 

private: 
    rapidxml::file<> m_xmlFile; 
    rapidxml::xml_document<> m_doc; 
}; 

//cpp 
Config::Config() 
    : m_xmlFile("config.xml") 
{ 
    m_doc.parse<0>(m_xmlFile.data()); 
} 

xml_node<>* Config::findNode(const char* name) 
{ 
    if (m_doc.first_node()) 
    { 
     return m_doc.first_node()->first_node(name); 
    } 

    return 0; 
} 

char* Config::getConfigValue(const char* name) 
{ 
    if (m_doc.first_node()) 
    { 
     xml_node<>* node = m_doc.first_node()->first_node(name); 
     if (node) 
     { 
      return node->value(); 
     } 
    } 

    return 0; 
} 
+0

有一個小錯字。應該是'rapidxml :: file <> m_xmlFile;'標頭內部,謝謝! – BennX

+0

是的,我修好了。現在很晚...我需要去睡覺。「 – Malketh

相關問題