From: Kouhei S. <ko...@co...> - 2006-05-17 14:18:30
|
須藤です. In <200...@to...> "[ruby-gnome2-devel-ja] "warning: GRClosure invoking callback: already destroyed"" on Wed, 17 May 2006 23:01:59 +0900 (JST), Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 最近のRuby/GLib2のコードはあまり真面目に読んでいないですが、 > 多分以下のようなことが起きているのではないでしょうか。 正解です. > b = Gtk::Button.new > b.signal_connect('clicked'){ } > > # (中略) 「ボタンのgtk側オブジェクトはgtk側できちんと参照されているが、 > # Ruby側のオブジェクトは(変数b以外からは)辿れない」という状態になる。(1) > > b = nil > GC.start > # ボタンのRuby側オブジェクトがGCされ、GRClosureHolderもGCされ、 > # GRClosureのcountが0になる。 > > # その後ボタンがクリックされる。 > # => "warning: GRClosure invoking callback: already destroyed" > > 現在のRuby-GNOME2は(1)のような状況が起らないようG_CHILD_ADD等で > 頑張っているみたいですが、Ruby-GNOME2側でいくら頑張っても、 > gtk側のコードでオブジェクトの参照関係が変化するような場合もあるので、 > そのような状況を完全に排除するのは現実的ではないでしょう。 GTK+側でごにょごにょやっていても,G_CHILD_REMOVEが呼ばれない 限りRuby側の参照がなくなりはしないので,リークはするかもしれ ないですがRuby側のボタンがGCされることはない気がします. といっても,↑は適当に書いているので実際に酒井さんのいうケー スがでるかもしれないです.私にはわからないです. |