我的代码看起来像这样:
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”而不是“组件”。任何人都可以告诉我这里发生了什么以及相同的解决方案。
答案 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
来解决此问题。