从类的成员函数返回指针
我的代码如下所示:
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”而不是“组件”。谁能告诉我这里发生了什么以及解决方案。
My code looks something like this:
xmlparser.h file:
#include <libxml++/libxml++.h>
#include <iostream>
using namspace std, xmlpp;
class xmlpar {
public:
xmlparse(){}
~xmlparse(){}
const Node* root_node();
};
xmlparser.cc file:
#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;
}
}
My main.cc file:
#include "xmlparser.h"
int main() {
xmlparser par;
const Node* root = par.root_node();
cout << root->get_name(); // prints "PQ". --> Problem location
}
I first compiled the xmlparser.cc file, then the main.cc, and then created an executable with both main.o and xmlparser.o . I'm not getting any error during compilation but Like in the code if I'm returning rnode from the method root_node(), the values of the root
gets changed to something like "PQ" instead of "component". Can anyone please tell me what's happening here and the solution to the same.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道
libxml2
,但似乎您返回了指向本地对象的指针。const Node* xmlpar::root_node()
中是本地对象。然后你做你所做的事情,最后使 rnode 指向文档中的某个位置。您返回指向它的指针,但在函数结束后(返回后),解析器将被销毁,因为它是本地对象。
这使得返回的指针无效,并且您有未定义的行为
I don't know
libxml2
, but it seems like you return pointer to a local object.in
const Node* xmlpar::root_node()
is a local object. Then you do what you do and finallywhich makes
rnode
to point to some place in the document. You return pointer to it, but after the end of the function (after it returns), theparser
is destroyed, as it's local object.This makes the returned pointer invalid and you have undefined behavior
这是因为 rnode 是一个局部变量,并且存储在堆栈中。因此,当 xmlpar::root_node 返回时,该变量不再存在。
您可以通过将
rnode
声明为static
来修复它。That's because
rnode
is a local variable, and stored on the stack. So whenxmlpar::root_node
returns the variable doesn't exist any more.You can fix it by declaring
rnode
to bestatic
.