共享资源

一些对象是从共享储存中获取的,例如Gdk::PixbufPango::Font。因此你无法实例化自己的实例。这些类通常继承自Glib::Objectgtkmm使用智能指针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将做必要的引用以确保在最后一个RefPtr超出作用域之前该实例不会被销毁。

更多与RefPtr有关的信息,请参见附录

如果你想了解与智能指针更多的有关信息,请阅读以下书籍:

  • Bjarne Stroustrup,《C++编程语言》第四版 第34章第3小节
  • Nicolai M. Josuttis,《C++标准库》第4章第2节