1

我有这段代码,它工作正常:

WebKit::WebView web;
// later:
{
    Glib::RefPtr<WebKit::WebSettings> settings = WebKit::WebSettings::create();
    // do some stuff to the object
    web.set_settings(settings);
}

稍后,当web仍在范围内但settings已超出范围时,我执行以下操作:

Glib::RefPtr<WebKit::WebSettings> settings = web.get_settings();

应该恢复上面创建的原始设置对象。然而实际发生的是,我在Glib::wrap_auto(从 调用get_settings)中得到了一个 SIGSEGV,输出如下:

GLib-GObject-CRITICAL **: g_object_get_qdata: assertion `G_IS_OBJECT (object)' failed

我的假设是,当第一个settings指针超出范围时,它以某种方式破坏了底层对象,尽管它被分配给了另一个对象的属性。为什么会这样?大概我在上面做错了什么,但代码对我来说似乎很理智。(我假设将对象分配给属性会增加 C 对象的引用计数。)

4

2 回答 2

0

尝试这个。不知道它是否会起作用:P

{
   Glib::RefPtr<WebKit::WebSettings> *settings = new WebKit::WebSettings::create();
   // do some stuff to the object (use -> instead of . since it's a pointer)
   web.set_settings(*settings); // dereference the pointer
}

// later
Glib::RefPtr<WebKit::WebSettings> settings = web.get_settings();

认为这会起作用的原因是因为设置指针将在堆上分配存储空间,并且指针将超出范围,但对象本身不会。不过我可能是错的,这只是 C++ 程序员的猜测,我对您正在使用的任何东西(webkit、gtk 等)都没有经验。

于 2011-04-19T05:26:53.013 回答
0

这很可能是绑定中的错误。你应该报告它。

于 2011-04-19T12:34:24.550 回答