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

Posted

技术标签:

【中文标题】使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理【英文标题】:Memory management of GTK+ objects using Glade and gtkmm 【发布时间】:2012-09-06 16:13:27 【问题描述】:

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



【问题讨论】:

【参考方案1】:

来自GTK+ reference manual:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理的主要内容,如果未能解决你的问题,请参考以下文章

进度条 gtkmm Glade

gtkmm & glade - 多个窗口不工作

关于 glade3 和 gtkmm 的 Linux / C++ 帮助

带有 gtkmm 的 Glade 构建的 TreeView

使用 gtkmm 编译 gtk 程序时出错

从 Glade 文件构建时,Gtkmm 自定义小部件会引发错误