Ressources partagées

Certains objets, tels que les Gdk::Pixmap et Pango::Font, s'obtiennent à partir d'un stockage partagé. Ainsi, vous ne pouvez pas créer vos propres exemplaires de ces classes. Elles héritent généralement de Glib::Object. Plutôt que vous demander de référencer et déréférencer ces objets, gtkmm utilise le « pointeur intelligent » RefPtr<>.

Les objets du type Gdk::Bitmap ne peuvent être instanciés qu'avec la fonction create(). Par exemple,

Glib::RefPtr<Gdk::Bitmap> bitmap = Gdk::Bitmap::create(window, data, width, height);

Il n'y a pas de moyen d'obtenir un objet Gdk::Bitmap vide. Dans l'exemple, bitmap est un pointeur intelligent, vous pouvez donc faire ceci, tout comme avec un pointeur normal :

if(bitmap)
{
  int depth = bitmap->get_depth().
}

Quand le bitmap est hors de portée, une fonction unref() se produit en arrière-plan et vous n'avez pas besoin de vous en soucier plus longtemps. Il n'y a pas d'opérateur new, il n'est donc pas nécessaire d'appeler delete.

Si vous copiez un RefPtr, par exemple

Glib::RefPtr<Gdk::Bitmap> bitmap2 = bitmap.
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