Recursos compartidos

Algunos objetos, como Gdk::Pixbuf y Pango::Font, se obtienen de un almacén compartido. Por lo tanto, no puede instanciar sus propias instancias. Estas clases típicamente heredan de Glib::Object. En lugar de requerirle referenciar y desreferenciar estos objetos, gtkmm usa el puntero inteligente Glib::RefPtr<>. Cairomm tiene su propio puntero inteligente, Cairo::RefPtr<>.

Objetos tales como Gdk::Pixbuf sólo pueden instanciarse con una función create(). Por ejemplo,

Glib::RefPtr<Gdk::Pixbuf> pixbuf = Gdk::Pixbuf::create_from_file(filename);

No hay manera de obtener un Gdk::Pixbuf simple. En este ejemplo, pixbuf es un puntero inteligente, por lo que puede hacer esto, de manera muy similar a un puntero normal:

int width = 0;
if(pixbuf)
{
  width = pixbuf->get_width();
}

Cuando pixbuf salga del alcance, un unref() sucederá en segundo plano y ya no necesitará preocuparse más de él. No hay new, por lo que no hay delete.

Si copia un RefPtr, por ejemplo

Glib::RefPtr<Gdk::Pixbuf> pixbuf2 = pixbuf;
, o si lo pasa como argumento a un método o como tipo de retorno, entonces RefPtr hará todas las referencias necesarias para asegurarse de que la instancia no se destruirá hasta que el último RefPtr haya salido del alcance.

Consulte el apéndice para obtener información detallada acerca de «RefPtr».

Si quiere aprender más acerca de punteros inteligentes, puede echarle un vistazo a estos libros:

  • Bjarne Stroustrup, «The C++ Programming Language»: sección 14.4.2
  • Nicolai M. Josuttis, «The C++ Standard Library» - sección 4.2