2011-11-02 95 views
2

我的代碼看起來是這樣的:從一個類的成員函數返回一個指針

xmlparser.h文件:

#include <libxml++/libxml++.h> 
#include <iostream> 
using namspace std, xmlpp; 

class xmlpar { 
    public: 
     xmlparse(){} 
     ~xmlparse(){} 
     const Node* root_node(); 
}; 

xmlparser.cc文件:

#include "xmlparser.h" 
const Node* xmlpar::root_node() { 
    const Node* rnode; 
    DomParser parser; 
    parser.parse_file("sample.xml"); 
    if (parser) { 
     rnode = parser.get->document()->get_root_node(); 
     cout << rnode->get_name(); // prints "component" as in xml file 
     return rnode; 
    } 
} 

我的主要.cc文件:

#include "xmlparser.h" 
int main() { 
    xmlparser par; 
    const Node* root = par.root_node(); 
    cout << root->get_name(); // prints "PQ". --> Problem location 
} 

我先編譯xmlparser.cc文件,然後編譯main.cc,然後用main.o和xmlparser.o創建一個可執行文件。編譯期間我沒有收到任何錯誤,但是在代碼中,如果我從方法root_node()返回rnode,則根 的值將更改爲「PQ」而不是「component」。任何人都可以告訴我這裏發生了什麼,以及相同的解決方案。

回答

4

我不知道libxml2,但它看起來像你返回指向本地對象的指針。

DomParser parser; 

in const Node* xmlpar::root_node()是一個本地對象。然後你做你所做的,最後

rnode = parser.get->document()->get_root_node(); 

這使得rnode指向文檔中的某個地方。你返回指向它的指針,但是在函數結束後(返回之後),parser被銷燬,因爲它是本地對象。

這使得返回的指針失效,你有未定義行爲

+2

解決這個問題的方法是將'parser'變量變成類的成員變量,而不是函數的局部變量。如果稍後需要從同一個XML文件中獲取更多節點,這也會更好。 –

+0

是的。或者也有2個輸出參數並使用'new'分配解析器。然後使用2個輸出參數返回分配的解析器和'rnode'。或者只是返回指向解析器的指針。 –

+1

非常感謝Kiril。我明白了這個問題,它的工作.. – sundar

0

這是因爲rnode是一個局部變量,並存儲在堆棧上。所以當xmlpar::root_node返回變量不再存在。

您可以通過聲明rnodestatic來解決此問題。

+0

這是關於在答案不正確,可以,恐怕。原因是'DomParser'是本地的。 –

+0

+1。我也建議移動解析器一個rnode成爲一個類的成員(私人,公共,無所謂) – koressak

+0

@ Moo-Juice:我的壞。看起來似乎還太早。柯里斯的回答更好。 –

相關問題