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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta