Уничтожение Glib :: RefPtr приводит к неудачным утверждениям в ядре GTK 3
Ребята из Gtkmm являютсяСравнение Glib::RefPtr
сstd::auto_ptr<>
:
Glib::RefPtr
is a smartpointer. Specifically, it is a reference-counting smartpointer. You might be familiar with std::auto_ptr<>
, which is also a smartpointer, but Glib::RefPtr<>
is much simpler, and more useful.
Но по какой-то странной причине я не могу выполнить свою работу сRefPtr
, Тот же код просто отлично сauto_ptr
.
В следующем кодеSmartPtr
это просто заполнитель для одного из этих двух smartpointers.
<code>#include <gtkmm.h> #include <iostream> #include <tr1/memory> struct WindowHolder { SmartPtr<Gtk::Window> ptr; WindowHolder() : ptr(new Gtk::Window) { ptr->signal_delete_event().connect(sigc::mem_fun(*this, &WindowHolder::reset)); ptr->show_all(); } bool reset(GdkEventAny* event) { Gtk::Main::quit(); } }; int main(int argc, char *argv[]) { Gtk::Main kit(argc, argv); WindowHolder w; kit.run(); } </code>
При компиляции я сначала определяюSmartPtr
какGlib::RefPtr
а потом какstd::auto_ptr
.
<code>$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out (main:22093): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed $ g++ '-DSmartPtr=std::auto_ptr' `pkg-config --cflags --libs gtkmm-3.0` main.cc && ./a.out $ </code>
Проблема в томGLib-GObject-CRITICAL
, В моем реальном приложении это не просто строка, а целая куча. Во второй версии сstd::auto_ptr
все разрушается хорошо.
Достаточно странный код, это просто прекрасно в GTK 2:
<code>$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out $ </code>
Я не хочу зависеть отstd::auto_ptr
потому что это устарело, и я также не хочу работать с необработанным указателем, потому что тогда деструкторам приходится вручную удалять указатели, что добавляет дополнительную сложность ...
Мои вопросы:
Why causesGlib::RefPtr
this "critical warning" (probably a double free)?
Why does it work with gtkmm 2.4 but not in 3.0?
Can I fix the code with Glib::RefPtr
and gtkmm 3.0?
How should I handle such situations in general?