Glib :: RefPtr超出范围后的SIGSEGV?

时间:2011-04-19 04:32:24

标签: c++ webkit gtk glib gtkmm

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

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对象的引用计数。)

2 个答案:

答案 0 :(得分: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等)。

答案 1 :(得分:0)

这很可能是绑定中的一个错误。你应该举报。