Destructing Glib :: RefPtr powoduje nieudane potwierdzenia w rdzeniu GTK 3
Chłopaki z Gtkmm sąporównanie Glib::RefPtr
zstd::auto_ptr<>
:
Glib::RefPtr
to smartpointer. W szczególności jest to smartpointer liczący referencje. Być może znaszstd::auto_ptr<>
, który jest również smartpointer, aleGlib::RefPtr<>
jest znacznie prostszy i bardziej użyteczny.
Ale z jakiegoś dziwnego powodu nie mogę wykonać mojej pracy za pomocąRefPtr
. Ten sam kod jest w porządku zauto_ptr
.
W następującym kodzieSmartPtr
jest tylko symbolem zastępczym dla jednego z tych dwóch smartpointerów.
<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>
Podczas kompilacji najpierw definiujęSmartPtr
tak jakGlib::RefPtr
a następnie jakstd::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>
Problem polega na tymGLib-GObject-CRITICAL
. W mojej prawdziwej aplikacji nie jest to tylko jedna linia, ale cała ich masa. W drugiej wersji zstd::auto_ptr
wszystko zostaje dobrze zniszczone.
Dziwny jest kod w GTK 2:
<code>$ g++ '-DSmartPtr=Glib::RefPtr' `pkg-config --cflags --libs gtkmm-2.4` main.cc && ./a.out $ </code>
Nie chcę na tym polegaćstd::auto_ptr
ponieważ jest przestarzały, a ja nie chcę pracować ze wskaźnikiem surowym, ponieważ wtedy destruktory muszą ręcznie usunąć wskaźniki, które dodają dodatkową złożoność ...
Moje pytania to:
Dlaczego przyczynyGlib::RefPtr
to „krytyczne ostrzeżenie” (prawdopodobnie podwójne bezpłatne)?Dlaczego działa z gtkmm 2.4, ale nie z 3.0?Czy mogę naprawić kod za pomocąGlib::RefPtr
i gtkmm 3.0?Jak powinienem radzić sobie z takimi sytuacjami w ogóle?