Уничтожение 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 causes Glib::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?

Ответы на вопрос(2)

Ваш ответ на вопрос