我正在使用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()
{
}
答案 0 :(得分:1)
GTK小部件是引用计数。当您关闭或销毁窗口时,它将释放其最后一个引用并被取消分配。 (虽然我相信构建器也有一个引用 - 但是当构建器被销毁时应该释放它。)
答案 1 :(得分:1)
GtkBuilder拥有对其构造的所有对象的引用 并在最终确定时删除这些引用。这个定稿可以 导致非小部件对象或小部件的破坏 包含在顶层窗口中。对于由a构造的顶层窗户 构建器,用户有责任致电 gtk_widget_destroy()摆脱它们以及它们的所有小部件 包含。
函数gtk_builder_get_object()和gtk_builder_get_objects() 可用于通过名称访问界面中的小部件 在UI描述中分配给他们。 Toplevel窗户返回 通过这些功能将保持不变,直到用户明确销毁 他们使用gtk_widget_destroy()。其他小部件将成为其中一部分 由构建器构造的更大层次结构(在这种情况下,您应该 不必担心他们的生命周期),或没有父母,在 在哪种情况下,他们必须添加到一些容器中才能使用 他们。需要使用g_object_ref()来保留非窗口小部件对象 它们超出了建造者的生命周期。
回答你的问题:是的,你应该在完成后手动销毁窗口。