2017-04-06 61 views
0

我在使用gtk-3的ruby 2.3.1時遇到內存泄漏。 在我的系統(Ubuntu 16-04)上,以下代碼消耗大約80 MB。 picture.jpg的大小是289kb。ruby​​的內存泄漏gtk-3

'需要 'gtk3'

def ptest 
    i=0 
    j=0 
    loop { 
    i += 1 
    j += 1 
    exit if j==50 
    @image = Gtk::Image.new 
    newPixbuf = GdkPixbuf::Pixbuf.new(:file => "picture.jpg") 
    @image.pixbuf = newPixbuf 
    @image.clear 
    @image=nil 
    if i == 10 
     p "GC" 
     GC.start 
     i = 0 
    end 
    } 
    end 

    ptest` 

根據https://sourceforge.net/p/ruby-gnome2/mailman/message/8659687/這不應該發生。我能做些什麼來釋放內存?

回答

0

顯然我的Ruby gdk3-Gem中有一個bug。寶石更新解決了這個問題。

0

我不是Ruby,但知道一些Gtk +。 在C中,你必須自己處理內存分配,你需要unf pixbuf。

GtkImage Documentation

的GtkImage不承擔到PIXBUF中的引用;如果您擁有參考資料,您仍然需要取消它。

所以,最有可能,如果紅寶石沒有實現ARC(自動引用計數的GObjects),您必須@image.pixbuf = newPixbuf後立即做類似newPixbuf.unref(不知道Ruby的語法)。

希望它有幫助。

+0

這是我的第一個想法,但不幸的是,在Pixbuf對象的ruby中沒有非反射方法。所以我認爲紅寶石垃圾收集器GC應該完成這項工作,但事實並非如此。 –

+0

unref方法不是Pixbuf方法,而是GObject方法,Pixbuf繼承自GObject。剛剛看到GC是垃圾收集器,但也許在Ruby中gobject-introspection不是那麼穩定。我試圖讀一下Ruby-Gtk +,事實上GLib –

+0

的ref/unref/reference counting方法有一些問題您可以嘗試一種與您提供的鏈接上的方法幾乎相似的解決方案,但只需要一點點調整?:'靜值 unref(self) VALUE self; { g_object_unref(_SELF(self)); return Qnil; } ......和修改幻燈片代碼... newPixbuf = GDK :: Pixbuf.new(@ filenames.next,1024,800) @ image.pixbuf = newPixbuf newPixbuf.unref' –

0

首先我不知道Ruby。

雖然你的「picture.jpg」文件是289 KB,但它將使用比未壓縮時更多的內存空間。

您正在創建一個Gtk :: Image並將圖像添加到該圖像中。 GTK +會創建這個OK,但是當你銷燬它時,GTK +分配給它的內存不會立即釋放。

從GTK + C文檔

注意到gtk_widget_destroy(這很重要)只會引起,如果沒有額外的參考,使用 g_object_ref(),被保持在它收購了 小工具來完成。如果在 的地方有其他參考,那麼在調用這個 函數之後,小部件將處於「惰性」狀態; 小部件仍然會指向有效內存,允許您發佈的引用,但您可能不會查詢該小部件的自己的狀態 。

控制返回到GTK +「主循環」時應釋放內存。在您的示例中尚未完成的任務尚未初始化或啓動。

+0

當然,我測試了主循環內的代碼,但無濟於事。我同意Pixbuf對象的引用應該被釋放,但是我不知道如何。 –