SIGSEGV после Glib :: RefPtr выходит за рамки? - PullRequest
1 голос
/ 19 апреля 2011

У меня есть этот бит кода, который работает нормально:

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.)

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

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

0 голосов
/ 19 апреля 2011

Попробуй это.Не знаю, будет ли это работать или нет: 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();

Причина I думаю, это будет работать, потому что при настройке указатель выделит память в куче, и указатель будет идтивыходит за рамки, но сам объект не будет.Хотя я могу ошибаться, это просто предположение программиста на C ++, у меня нет опыта ни с какими вещами, с которыми вы работаете (webkit, gtk и т. Д.).

...