使用Glade和gtkmm对GTK +对象进行内存管理

时间:2012-09-06 16:13:27

标签: c++ gtk gnome glade gtkmm

我正在使用C ++创建一个使用GTK +和glade的程序。我担心林间空地创建的对象的内存管理。例如,我创建了一个由窗口,按钮和两个输入字段组成的glade文件。然后在我的C ++代码中,我从该文件创建一个对象并获得指向该窗口的指针。我的问题是,当我完成时,我是否必须安全地释放窗口对象?如果没有,为什么我不必?以下是我的代码示例...

#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()
{

}

2 个答案:

答案 0 :(得分:1)

GTK小部件是引用计数。当您关闭或销毁窗口时,它将释放其最后一个引用并被取消分配。 (虽然我相信构建器也有一个引用 - 但是当构建器被销毁时应该释放它。)

答案 1 :(得分:1)

来自GTK+ reference manual

  

GtkBuilder拥有对其构造的所有对象的引用   并在最终确定时删除这些引用。这个定稿可以   导致非小部件对象或小部件的破坏   包含在顶层窗口中。对于由a构造的顶层窗户   构建器,用户有责任致电   gtk_widget_destroy()摆脱它们以及它们的所有小部件   包含。

     

函数gtk_builder_get_object()和gtk_builder_get_objects()   可用于通过名称访问界面中的小部件   在UI描述中分配给他们。 Toplevel窗户返回   通过这些功能将保持不变,直到用户明确销毁   他们使用gtk_widget_destroy()。其他小部件将成为其中一部分   由构建器构造的更大层次结构(在这种情况下,您应该   不必担心他们的生命周期),或没有父母,在   在哪种情况下,他们必须添加到一些容器中才能使用   他们。需要使用g_object_ref()来保留非窗口小部件对象   它们超出了建造者的生命周期。

回答你的问题:是的,你应该在完成后手动销毁窗口。