Ressources partagées

Some objects, such as Gdk::Pixbufs and Pango::Fonts, are obtained from a shared store. Therefore you cannot instantiate your own instances. These classes typically inherit from Glib::Object. Rather than requiring you to reference and unreference these objects, gtkmm uses the Glib::RefPtr<> smartpointer. Cairomm has its own smartpointer, Cairo::RefPtr<>.

Objects such as Gdk::Pixbuf can only be instantiated with a create() function. For instance,

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

You have no way of getting a bare Gdk::Pixbuf. In the example, pixbuf is a smart pointer, so you can do this, much like a normal pointer:

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

When pixbuf goes out of scope an unref() will happen in the background and you don't need to worry about it anymore. There's no new so there's no delete.

Si vous copiez un RefPtr, par exemple

Glib::RefPtr<Gdk::Pixbuf> pixbuf2 = pixbuf;
ou si vous le passez en tant que paramètre de fonction ou en tant que type de retour, alors le pointeur RefPtr fera tout référencement nécessaire pour assurer que cette instance ne soit pas détruite avant que le RefPtr ne soit pas hors de portée.

Consultez cette annexe pour une information détaillée concernant les RefPtr.

Si vous voulez en savoir plus à propos des pointeurs intelligents, vous pouvez consulter les ouvrages suivants :

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