共享资源
一些对象是从共享储存中获取的,例如Gdk::Pixbuf和Pango::Font。因此你无法实例化自己的实例。这些类通常继承自Glib::Object。gtkmm使用智能指针Glib::RefPtr<>而不是要求你引用和解引用这些对象。开罗有自己的智能指针:Cairo::RefPtr<>。
诸如Gdk::Pixbuf之类的对象只能通过create()函数进行实例化。例如:
auto pixbuf = Gdk::Pixbuf::create_from_file(filename);
你无法暴露Gdk::Pixbuf对象。在示例中,pixbuf是一个智能指针,因此可以像正常指针一样执行此操作:
auto width = 0; if(pixbuf) { width = pixbuf->get_width(); }
当pixbuf超出作用域时,将在后台调用unref(),你无需为它担心。没有进行new因此也不需要进行delete。
如果你复制一个RefPtr,例如:
auto pixbuf2 = pixbuf;
更多与RefPtr有关的信息,请参见附录。
如果你想了解与智能指针更多的有关信息,请阅读以下书籍:
- Bjarne Stroustrup,《C++编程语言》第四版 第34章第3小节
- Nicolai M. Josuttis,《C++标准库》第4章第2节