From: Masao M. <mu...@hi...> - 2007-06-20 15:45:20
|
むとうです。 On Wed, 20 Jun 2007 02:07:32 +0900 (JST) Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > 酒井です。 > > From: Masao Mutoh <mu...@hi...> > Date: Wed, 20 Jun 2007 01:52:02 +0900 > > > むとうです。 > > > > On Wed, 20 Jun 2007 01:38:05 +0900 (JST) > > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > > > 酒井です。 > > > > > > うげげ。 > > > > 解放済みのGRClosure上のcallbackやextra_argsをrb_gc_mark()してますね。 > > > > オブジェクトの寿命と解放に関する考察に抜けがありました。 > > > > 修正は簡単だと思うけど、また明日…… > > > > > > 修正しました。 > > > > ありがとうございます。 > > 例のtest_signal_disconnection.rbで確認しました。 > > > > #にしても、メモリリークしてるという質問者の意図を読み取るところ > > #から始めるのは骨が折れますね・・・。もっと簡単なサンプルないのかな。 > > 多分、「シグナルハンドラをdisconnectしても、オブジェクトがブロックを参 > 照したままで、ブロックから参照されているオブジェクトがGCされない」とい > う話でしょう。 そうみたいですね。 以下のスクリプトだとその要件って満たせてますかね? ひとまず、メモリリークはしてないみたいなんですけど・・・。 #それとも何か抜けあります? Gtk.idle_addあたりがポイント? require 'gtk2' def test a = Gtk::Button.new handler_id = a.signal_connect("clicked"){1 + 1} # a.signal_handler_disconnect(handler_id) # a.destroy end loop { test GC.start } これでtopを見続けてもメモリ増えないんですよね。 GC.startを削ると増え続けるんですが。 |