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?

questionAnswers(2)

yourAnswerToTheQuestion