2012-09-06 83 views
1

我正在使用C++創建一個使用GTK +和glade的程序。我擔心空地創建的對象的內存管理。例如,我創建了一個由窗口,按鈕和兩個輸入字段組成的glade文件。然後在我的C++代碼中,我從該文件創建一個對象並獲取指向該窗口的指針。我的問題是,當我完成後,是否必須安全地釋放窗口對象?如果沒有,爲什麼我不需要?以下是我的代碼示例...使用Glade和gtkmm對GTK +對象進行內存管理

#include <gtkmm.h> 
#include "MattWindow.h" 

#include <iostream> 

using namespace std; 

void buttonpush(); 

int main(int argc, char* argv[]) 
{ 
    //This line initializes the GTK+ system 
    Gtk::Main kit(argc,argv); 

    //Declare a pointer to a window 
    Gtk::Window* window = 0; 

    try 
    { 
     //Load the glade file 
     Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("layout.glade"); 

     Assign window to point to the window object 
     builder->get_widget("window1",window); 
     window->show(); 
    } 
    catch(Gtk::BuilderError& e) 
    { 
     cout<<e.what(); 
    } 

    //Start everything up 
    Gtk::Main::run(); 



    //Who destroys the object that window is currently pointing to? 

    return 0; 
} 

void buttonpush() 
{ 

} 

回答

1

GTK+ reference manual

一個GtkBuilder持有到它已經構建 所有對象的引用並在最終確定時放棄這些參考。此最終化可能導致銷燬上層窗口中包含的非外掛件對象或外掛件,而非外掛件 。對於由 構建器構建的頂層窗口,用戶有責任調用 gtk_widget_destroy()來消除它們以及它們包含的所有小部件。

功能gtk_builder_get_object()和gtk_builder_get_objects() 可以用於通過分配給它們的UI描述內的名稱 訪問的界面的窗口小部件。透過這些函數返回的摺疊窗口 將停留,直到用戶明確地用gtk_widget_destroy()銷燬它們 。其他小部件將成爲構建器構建的較大層次結構的一部分(在這種情況下,您應該 不必擔心它們的生命週期),或者在沒有父項的情況下,在 中,它們必須添加到某個容器中以製作他們使用 。非小部件對象需要用g_object_ref()來緩衝,以使它們在構建器的生命週期之外保持 。

要回答你的問題:是的,你應該手動銷燬窗口,當你完成它。

1

GTK窗口小部件是引用計數。當你關閉或銷燬你的窗口時,它將釋放它的最後一個引用並被釋放。 (雖然我相信建造者還擁有一個參考 - 但是當構造器被破壞應被釋放。)