使用Glade和gtkmm对GTK+对象进行内存管理
Memory management of GTK+ objects using Glade and gtkmm
我正在使用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()
{
}
来自GTK+参考手册:
GtkBuilder保存对其构建的所有对象的引用并在最终确定时删除这些引用。此定稿可以导致非窗口小部件对象或不是包含在顶层窗口中。对于由建设者,用户有责任调用gtk_widget_destroy()来清除它们和它们的所有小部件包含
函数gtk_builder_get_object()和gtk_bbuilder_get_oObjects()可以通过名称访问界面中的小部件在UI描述中分配给它们。返回顶层窗口这些函数将一直存在,直到用户明确地销毁它们使用gtk_widget_destroy()。其他小部件将是构建器构建的更大层次结构(在这种情况下,您应该不必担心它们的生命周期),或者在没有父母的情况下在这种情况下,必须将它们添加到某个容器中才能使用他们非小部件对象需要使用g_object_ref()进行reffed以保持它们超过了建筑商的使用寿命。
要回答您的问题:是的,您应该在完成后手动销毁窗口。
GTK小部件被引用计数。当您关闭或销毁窗口时,它将释放最后一个引用并被释放。(虽然我相信构建器也有一个引用,但应该在构建器被销毁时释放。)
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理