1

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

}
4

2 回答 2

1

来自GTK+ 参考手册

GtkBuilder 持有对它所构造的所有对象的引用,并在完成时删除这些引用。这种终结可能导致非小部件对象或不包含在顶级窗口中的小部件的破坏。对于由构建器构建的顶层窗口,用户有责任调用 gtk_widget_destroy() 来删除它们以及它们包含的所有小部件。

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

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

于 2012-09-06T20:06:39.520 回答
1

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

于 2012-09-06T20:04:32.743 回答