よたらぼ
自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。

March 25, 2004 [おもひで]

[Ruby-GNOME2] GC + Gtk::Widget#destroy

MLで指摘されたんだけど、ウィジェットはいつGCの対象になるべきなのだろう。

require 'gtk2'
class Test
  def hoge
    win = Gtk::Window.new.show_all
    nil
  end
end
Gtk.init
Test.new.hoge
GC.start
Gtk.main

ここで、winはローカル変数なんだから、hogeを呼び出した後で(ウィジェット自体)GCされるべきじゃないの、というのが指摘内容。RubyのオブジェクトとしてはGCされるのかもしれないのだけどウインドウは表示されたままだ。

Rubyオブジェクトの生死のスコープと完全に一致させる必要があるなら、このタイミングでウィジェット自体を破壊(Gtk::Widget#destroyを内部的に呼び出す)してあげないといけないのかもしれない。

でも、それはそれでいろいろ問題ありそうだなー。

本日のツッコミ(全4件) [ツッコミを入れる]
なかだ (March 26, 2004 00:24)

そもそも変数のスコープとオブジェクトのスコープは別物です。<br>ウィジェットに対応するオブジェクトは、Window Systemから<br>(ウィジェットを介して)参照されていると考えるのが自然では。

むとぽん (March 26, 2004 02:04)

オブジェクトとはRubyのオブジェクト(インスタンス)って意味ですよね。<br>ファイルアクセス(openとcloseをする必要がある)みたいなのをイメージしたのですけど、そんな感じですかねー。

なかだ (March 26, 2004 09:35)

「openとcloseをする必要がある」に対応するのは「new.show_allとdestroyをする必要がある」でしょう。<br>show_allがブロックを受け付けるようにして、最後にdestroyするとか?

むとぽん (March 26, 2004 20:52)

そうですねぇ。その場合、実際はshow_allではなく、newでブロック作るようになるんでしょうけど、シグナルハンドラの中でdestroyを書いたりするのでちょっと気持ち悪いような...。でも慣れの問題なのかも。


編集