【发布时间】:2018-02-21 17:17:19
【问题描述】:
我有以下 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 不抱怨的情况下正确释放它?
【问题讨论】:
-
您需要
G_DEBUG=gc-friendly和G_SLICE=always-malloc才能使 valgrind 与GObject正常工作。 This answer also has some useful information. -
拜托拜托,除非你真的有很好的理由这样做(比如维护一个不值得迁移的大而老的应用程序),否则不要使用 GTK+ 2。GTK+ 3 已经存在 7 年了年 (!),GTK+ 4 可能会在 2019 年发布。
-
@liberforce 我可能会将程序迁移到 GTK+ 3。我开始使用 GTK+2 的原因仅仅是因为 Slackware 为 Glade 提供了一个支持 GTK+2 的版本。
-
在发行版中,glade 通常打包为
glade或glade3,一个版本用于GTK+ 2,另一个用于GTK+ 3。棘手的是glade3用于GTK+ 2 (版本 glade 用于 GTK+ 3(版本 > 3.8),如glade website 所示。所以你应该可以找到glade for slackware。
标签: c memory-leaks gtk valgrind gtk2