【问题标题】:Memory management of GTK+ objects using Glade and gtkmm使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理
【发布时间】: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()
{

}

【问题讨论】:

    标签: c++ gtk gnome glade gtkmm


    【解决方案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 小部件是引用计数的。当您关闭或销毁窗口时,它将释放其最后一个引用并被释放。 (虽然我相信构建器也有一个引用 - 但应该在构建器被销毁时释放。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多