首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确释放GtkBuilder对象

正确释放GtkBuilder对象
EN

Stack Overflow用户
提问于 2018-02-21 17:17:19
回答 1查看 383关注 0票数 1

我有以下GTK+程序

代码语言:javascript
复制
////////////////////////////////////////////////////
// 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文件:

代码语言:javascript
复制
<?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是那些将被“泄露”的资源之一,还是有一种方法可以正确地发布它,而不抱怨它呢?

EN

回答 1

Stack Overflow用户

发布于 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 ()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48911820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档