从类的成员函数返回指针

发布于 2024-12-13 00:51:23 字数 1051 浏览 1 评论 0原文

我的代码如下所示:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

幻梦 2024-12-20 00:51:23

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

DomParser parser;

const Node* xmlpar::root_node() 中是本地对象。然后你做你所做的事情,最后

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

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

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

I don't know libxml2, but it seems like you return pointer to a local object.

DomParser parser;

in const Node* xmlpar::root_node() is a local object. Then you do what you do and finally

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

which 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), the parser is destroyed, as it's local object.

This makes the returned pointer invalid and you have undefined behavior

演出会有结束 2024-12-20 00:51:23

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

您可以通过将 rnode 声明为 static 来修复它。

That's because rnode is a local variable, and stored on the stack. So when xmlpar::root_node returns the variable doesn't exist any more.

You can fix it by declaring rnode to be static.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文