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

Memory management of GTK+ objects using Glade and gtkmm

本文关键字:内存 管理 对象 GTK+ Glade gtkmm 使用      更新时间:2023-10-16

我正在使用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()
{
}

来自GTK+参考手册:

GtkBuilder保存对其构建的所有对象的引用并在最终确定时删除这些引用。此定稿可以导致非窗口小部件对象或不是包含在顶层窗口中。对于由建设者,用户有责任调用gtk_widget_destroy()来清除它们和它们的所有小部件包含

函数gtk_builder_get_object()和gtk_bbuilder_get_oObjects()可以通过名称访问界面中的小部件在UI描述中分配给它们。返回顶层窗口这些函数将一直存在,直到用户明确地销毁它们使用gtk_widget_destroy()。其他小部件将是构建器构建的更大层次结构(在这种情况下,您应该不必担心它们的生命周期),或者在没有父母的情况下在这种情况下,必须将它们添加到某个容器中才能使用他们非小部件对象需要使用g_object_ref()进行reffed以保持它们超过了建筑商的使用寿命。

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

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