从类的成员函数返回指针

时间:2011-11-02 08:03:08

标签: c++ libxml2

我的代码看起来像这样:

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;
    }
 }

我的main.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”而不是“组件”。任何人都可以告诉我这里发生了什么以及相同的解决方案。

2 个答案:

答案 0 :(得分:4)

我不知道libxml2,但似乎你返回指向本地对象的指针。

DomParser parser;
const Node* xmlpar::root_node()中的

是本地对象。然后你做你做的事,最后

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

使rnode指向文档中的某个位置。您返回指向它的指针,但在函数结束后(在它返回之后),parser被销毁,因为它是本地对象。

这会使返回的指针无效,并且您有未定义的行为

答案 1 :(得分:0)

那是因为rnode是一个局部变量,并存储在堆栈中。因此,当xmlpar::root_node返回时,变量不再存在。

您可以通过将rnode声明为static来解决此问题。