gpt4 book ai didi

c++ - 作为成员变量的 Rapidjson 文档使该应用程序崩溃

转载 作者:行者123 更新时间:2023-11-28 02:48:23 24 4
gpt4 key购买 nike

当我使用 rapidjson 文档作为成员变量并执行此操作时:

class Test
{
rapidjson::Document m_jsonDocument;

public:
void f()
{
// WORKS FINE
rapidjson::Document document;
if (document.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())
printf("ERROR PARSING JSON\n");
else
printf("%s\n", document["hello"].GetString());


// BUT HERE THROWS, WHY?
if (m_jsonDocument.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())
printf("ERROR PARSING JSON\n");
else
printf("%s\n", m_jsonDocument["hello"].GetString());
}
};

当我调用 if (m_jsonDocument.Parse<0>("{ \"hello\" : \"world\" }").HasParseError())应用程序在线崩溃 flags_ = defaultFlags[type];document.h在 CTOR GenericValue(Type type) . Visual Studio 调试器显示“无法读取内存”。对于 _flags .问题是什么?成员变量和局部变量有什么区别?


编辑: 我设置了 f作为回调使用 setResponseCallback defined heref正在使用 dispatchResponseCallbacks 作为回调调用defined here .

最佳答案

问题很可能是,当调用成员函数指针 f 时,它是在没有实际对象的情况下调用的,这意味着成员函数中的 this 指针是无效的。这导致 undefined behavior当您尝试访问成员变量时,因为这些访问隐含地使用了(无效的)this 指针。

有几种方法可以解决这个问题,最直接的是使用静态成员函数作为回调,并将对象的实例作为用户数据传递(大多数回调系统都允许这样做)。然后静态成员函数可以使用用户数据对象指针调用真正的函数。

有点像

class Test
{
...

public:
static void f_wrapper(Test* object)
{
object->f();
}
};

然后做例如

Test object;
set_callback(&Test::f_wrapper, &object);

注意 object 不要超出范围。

关于c++ - 作为成员变量的 Rapidjson 文档使该应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23631836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com