La destrucción de Glib :: RefPtr provoca afirmaciones fallidas en el núcleo de GTK 3
Los chicos de Gtkmm soncomparando Glib::RefPtr
constd::auto_ptr<>
:
Glib::RefPtr
es un puntero inteligente. Específicamente, es un punto inteligente de recuento de referencias. Usted puede estar familiarizado constd::auto_ptr<>
, que también es un punto inteligente, peroGlib::RefPtr<>
Es mucho más simple, y más útil.
Pero por alguna extraña razón, no puedo terminar mi trabajo con elRefPtr
. El mismo código está bien con unauto_ptr
.
En el siguiente código,SmartPtr
es solo un marcador de posición para uno de estos dos 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>
Al compilar, primero definoSmartPtr
comoGlib::RefPtr
y luego comostd::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>
El problema es esteGLib-GObject-CRITICAL
. En mi aplicación real, esto no es solo una línea, sino un montón de ellos. En la segunda versión constd::auto_ptr
Todo se destruye bien.
Por extraño que parezca el código, está bien en GTK 2:
<code>$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out $ </code>
No quiero depender destd::auto_ptr
porque está en desuso y tampoco quiero trabajar con un puntero en bruto porque los destructores tienen que eliminar manualmente los punteros, lo que agrega complejidad adicional ...
Mis preguntas son:
Por que causaGlib::RefPtr
Esta "advertencia crítica" (probablemente una doble gratis)?¿Por qué funciona con gtkmm 2.4 pero no en 3.0?¿Puedo arreglar el código conGlib::RefPtr
y gtkmm 3.0?¿Cómo debo manejar tales situaciones en general?