2012-09-06 55 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窗口小部件是引用计数。当你关闭或销毁你的窗口时,它将释放它的最后一个引用并被释放。 (虽然我相信建造者还拥有一个参考 - 但是当构造器被破坏应被释放。)