使用 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+ 对象进行内存管理的主要内容,如果未能解决你的问题,请参考以下文章