SIGSEGV после того, как Glib::RefPtr выходит из области видимости?

#c #webkit #gtk #glib #gtkmm

#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();
  

Это должно восстановить исходный объект настроек, созданный выше. Однако на самом деле происходит то, что я получаю SIGSEGV в Glib::wrap_auto (вызываемый из get_settings ) со следующим выводом:

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

Я предполагаю, что каким-то образом, когда первый settings указатель выпал из области видимости, он уничтожил базовый объект, несмотря на то, что он был присвоен свойству другого объекта. Почему это происходит? Предположительно, я делаю что-то неправильно выше, но код кажется мне нормальным. (Я предполагаю, что присвоение объекта свойству увеличит количество ссылок на объект C.)

Ответ №1:

вполне возможно, что это ошибка в привязке. Вы должны сообщить об этом.

Комментарии:

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 и т.д.).