我有以下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>
当我使用Valgrind编译并运行内存检查时,它会抱怨分配给GtkBuilder
的内存可能丢失了。当我取消注释g_free()
指令时,我收到有关对free()
的无效调用的错误。
我知道GTK +框架本身有一些泄漏,即它不会释放它在整个生命周期中所需的资源。 GtkBuilder
其中一个资源会被“泄露”,或者有没有办法在没有Valgrind抱怨的情况下正确发布它?
答案 0 :(得分:2)
在“取消引用”之后,由于你没有增加引用计数,即引用计数已经下降到0,那么对象就被释放了。之后使用g_free()
将是一个错误。
g_object_unref ()
void g_object_unref (gpointer object)
;减少对象的引用计数。 当它的引用计数时 下降到0,对象最终确定(即释放其内存)。
如果将来可以重用指向
GObject
的指针(例如,如果 它是另一个对象的实例变量),建议使用 清除指向NULL
的指针,而不是保留指向a的悬空指针 可能无效的GObject
实例。请使用g_clear_object ()
。