获取小部件(“窗口1”,窗口); 窗口->显示(); } 捕获(Gtk::BuilderError&e) { cout,c++,gtk,gnome,glade,gtkmm,C++,Gtk,Gnome,Glade,Gtkmm" /> 获取小部件(“窗口1”,窗口); 窗口->显示(); } 捕获(Gtk::BuilderError&e) { cout,c++,gtk,gnome,glade,gtkmm,C++,Gtk,Gnome,Glade,Gtkmm" />

GTK+的内存管理;使用Glade和gtkmm的对象 < >我用C++来创建一个使用GTK+和GLAD的程序。我关心的是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() { } #包括 #包括“mattwindown.h” #包括 使用名称空间std; void buttonpush(); int main(int argc,char*argv[]) { //该行初始化GTK+系统 Gtk::主套件(argc、argv); //声明指向窗口的指针 Gtk::Window*Window=0; 尝试 { //加载glade文件 Glib::RefPtr builder=Gtk::builder::从_文件(“layout.glade”)创建_; 将窗口指定为指向窗口对象 生成器->获取小部件(“窗口1”,窗口); 窗口->显示(); } 捕获(Gtk::BuilderError&e) { cout

GTK+的内存管理;使用Glade和gtkmm的对象 < >我用C++来创建一个使用GTK+和GLAD的程序。我关心的是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() { } #包括 #包括“mattwindown.h” #包括 使用名称空间std; void buttonpush(); int main(int argc,char*argv[]) { //该行初始化GTK+系统 Gtk::主套件(argc、argv); //声明指向窗口的指针 Gtk::Window*Window=0; 尝试 { //加载glade文件 Glib::RefPtr builder=Gtk::builder::从_文件(“layout.glade”)创建_; 将窗口指定为指向窗口对象 生成器->获取小部件(“窗口1”,窗口); 窗口->显示(); } 捕获(Gtk::BuilderError&e) { cout,c++,gtk,gnome,glade,gtkmm,C++,Gtk,Gnome,Glade,Gtkmm,GTK窗口小部件是引用计数的。当您关闭或销毁窗口时,它将释放其最后一个引用并被释放。(虽然我相信构建器也持有一个引用,但应该在构建器被销毁时释放。)来自: GtkBuilder保存对其构造的所有对象的引用 并在完成时删除这些引用。此完成可以 导致非小部件对象或非小部件的销毁 包含在顶级窗口中。对于由 建筑商,用户有责任调用 gtk_widget_destroy()来清除它们和它们所使用的所有小部件 包含 函数gtk_builder_get_object()和gtk_builder_get_obj

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

来自:

GtkBuilder保存对其构造的所有对象的引用 并在完成时删除这些引用。此完成可以 导致非小部件对象或非小部件的销毁 包含在顶级窗口中。对于由 建筑商,用户有责任调用 gtk_widget_destroy()来清除它们和它们所使用的所有小部件 包含

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

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