正确释放GtkBuilder对象

时间:2018-02-21 17:17:20

标签: c memory-leaks gtk valgrind gtk2

我有以下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抱怨的情况下正确发布它?

1 个答案:

答案 0 :(得分:2)

在“取消引用”之后,由于你没有增加引用计数,即引用计数已经下降到0,那么对象就被释放了。之后使用g_free()将是一个错误。

来自documentation

  

g_object_unref ()

     

void g_object_unref (gpointer object);

     

减少对象的引用计数。 当它的引用计数时   下降到0,对象最终确定(即释放其内存)。

     

如果将来可以重用指向GObject的指针(例如,如果   它是另一个对象的实例变量),建议使用   清除指向NULL的指针,而不是保留指向a的悬空指针   可能无效的GObject实例。请使用g_clear_object ()