我有以下GTK+程序
////////////////////////////////////////////////////
// Example can be compiled with:
// gcc gui.c `pkg-config --cflags --libs gtk+-2.0`
//
// GUI file from glade must be in same folder from
// which the compiled binary is called.
////////////////////////////////////////////////////
#include <gtk/gtk.h>
int main(int argc, char *argv[]) {
GtkBuilder *gtkBuilder = gtk_builder_new();
gtk_init(&argc, &argv);
gtk_builder_add_from_file(gtkBuilder, "../gui.glade", NULL);
gtk_builder_connect_signals(gtkBuilder, NULL);
gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "main")));
g_object_unref(G_OBJECT(gtkBuilder));
// g_free(gtkBuilder);
gtk_main();
return 0;
}以及相应的XML Glade文件:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="main">
<property name="width_request">400</property>
<property name="height_request">300</property>
<property name="can_focus">False</property>
<property name="default_width">690</property>
<property name="default_height">500</property>
<signal name="destroy" handler="gtk_main_quit" swapped="no"/>
<child>
<placeholder/>
</child>
</object>
</interface>当我编译并运行一个使用Val差伦的内存检查时,它会抱怨分配给GtkBuilder的内存可能丢失了。当我取消对g_free()指令的注释时,我会得到一个关于对free()的无效调用的错误。
我知道GTK+框架本身存在一些漏洞,即它不会在整个生命周期中释放所需的资源。GtkBuilder是那些将被“泄露”的资源之一,还是有一种方法可以正确地发布它,而不抱怨它呢?
发布于 2018-02-21 17:27:01
在“取消引用”之后,由于您没有增加引用计数,即引用计数下降到0,那么它释放的对象。事后使用g_free()将是一个错误。
来自文档
g_object_unref ()void g_object_unref (gpointer object); 减少对象的引用计数。当它的引用数下降到0时,对象就完成了(即它的内存被释放)。 如果将来可能重用指向GObject的指针(例如,如果它是另一个对象的实例变量),则建议清除指向NULL的指针,而不是保留指向潜在无效的GObject实例的悬空指针。为此使用g_clear_object ()。
https://stackoverflow.com/questions/48911820
复制相似问题