【问题标题】:SIGSEGV after Glib::RefPtr goes out of scope?Glib::RefPtr 后的 SIGSEGV 超出范围?
【发布时间】:2011-04-19 04:32:24
【问题描述】:

我有这段代码,运行良好:

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

【问题讨论】:

    标签: c++ webkit gtk glib gtkmm


    【解决方案1】:

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

    【讨论】:

    • 是的,似乎是。我最近一直在搞乱更新绑定以解决这个问题,以及包含新的 webkit 功能,否则会丢失。
    【解决方案2】:

    试试这个。不知道它是否会起作用: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 等)都没有经验。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 2023-03-27
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2012-05-04
      • 2018-07-18
      • 1970-01-01
      相关资源
      最近更新 更多