Κοινόχρηστοι πόροι

Κάποια αντικείμενα, όπως Gdk::Pixbufs και Pango::Fonts, παίρνονται από μια κοινόχρηστη μνήμη. Συνεπώς δεν μπορείτε να δημιουργήσετε τα δικά σας στιγμιότυπα. Αυτές οι κλάσεις τυπικά κληρονομούν από την Glib::Object. Αντί να σας ζητιέται να αναφέρετε και να αποαναφέρετε αυτά τα αντικείμενα, η gtkmm χρησιμοποιεί τον έξυπνο δείκτη Glib::RefPtr<>. Το Cairomm έχει τον δικό του έξυπνο δείκτη, 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();
}

Όταν η pixbuf βγαίνει εκτός εμβέλειας μιας unref() θα συμβεί στο παρασκήνιο και δεν χρειάζεται να ανησυχείτε για αυτό πια. Δεν υπάρχει κανένα new, έτσι δεν υπάρχει κανένα delete.

If you copy a RefPtr, for instance

Glib::RefPtr<Gdk::Pixbuf> pixbuf2 = pixbuf;
, or if you pass it as a method argument or a return type, then RefPtr will do any necessary referencing to ensure that the instance will not be destroyed until the last RefPtr has gone out of scope.

Δείτε το παράρτημα για λεπτομερείς πληροφορίες σχετικά με την RefPtr.

If you wish to learn more about smartpointers, you might look in these books:

  • Bjarne Stroustrup, "The C++ Programming Language" Forth Edition - section 34.3
  • Nicolai M. Josuttis, "The C++ Standard Library" - section 4.2