共有リソース

Gdk::PixmapPango::Fontなどの、ある種のオブジェクトは共有のストックから取り出されています。したがってプログラマが自分で勝手にインスタンスを作ることはできません。これらはGlib::Objectを継承する典型的なクラスです。このようなオブジェクトでは参照を持ったり破棄したりするよりも、gtkmmRefPtr<>スマートポインタを使った方がいいでしょう。

Gdk::Bitmapなどのオブジェクトはcreate()関数でのみインスタンス化することができます。例えば:

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

しかし、Gdk::Bitmapのオブジェクトそのものを取得する方法はありません。例ではbitmapはスマートポインタであり、通常のポインタと同様次のようにすることが出来ます:

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

bitmap変数はスコープの外に出るとunref()がバックグラウンドで呼ばれますから、もう気にすることはありません。newがないのですからdeleteも要らないのです。

RefPtrがコピーされた場合、例えば:

Glib::RefPtr<Gdk::Bitmap> bitmap2 = bitmap.

あるいは、メソッド引数や戻り値として与えられた場合には、RefPtrは破棄されていないことがわかっているインスタンスへの参照を持ちつづけます。これは最後のRefPtrがスコープの外に出るまで行われます。

RefPtrについての詳しい情報はappendixを参照してください。

スマートポインタについてさらに学習したければこれらの本を見るといいでしょう: