zoukankan      html  css  js  c++  java
  • gtk_object_sink的妙处

    gtk_object_sink的妙处

     

    转载时请注明出处和作者联系方式:http://blog.csdn.net/absurd

    作者联系方式:Li XianJing <xianjimli at hotmail dot com>

    更新时间:2006-1-15

     

    在很长一段时间内,我一直不太明白gtk_object_sink这个函数的意义,它的实现也很简单:

     

    void

    gtk_object_sink (GtkObject *object)

    {

      g_return_if_fail (GTK_IS_OBJECT (object));

     

      if (GTK_OBJECT_FLOATING (object))

        {

          GTK_OBJECT_UNSET_FLAGS (object, GTK_FLOATING);

          g_object_unref (object);

        }

    }

     

    从代码的表面意义来看,也就是如果一个对象没有放入容器,就把它把反引用。功能很简单,但它的具体有什么用处呢。直到后来去阅读GTK+的代码,才明白它的妙处。

     

    试想这样一种情况:把一个widget放入container中,调用者要不要反引用这个widget?

     

    如果要,那也是合情合理的,container要保存widget的指针,当然要引用它(增加引用计数),在container销毁时反引用它。但是对调用者来说,就比较麻烦了,特别是widget比较多的情况,一个一个的去反引用它们,很容易遗漏,从而引起内存泄露。

     

    如果不要,调用者是方便了,但container怎么办?保存widget的指针,但不增加的它的引用计数?而在container销毁时,却要反引用widget?虽然不是很合理,但在通常情况下也能工作。但如果把widget同时放入多个container中时,麻烦来了:这些container都没有引用widget,却在销毁时反引用它,程序一定会崩掉的。

     

    怎么办呢?这时gtk_object_sink函数的妙处就显露出来了:对象在创建时,引用计数为1。在放入容器时,先增加对象的引用计数,然后调用gtk_object_sink。如果是第一次放入容器,OBJECT_FLOATING (object)为真,引用计数就减下来了,后面再加入容器时,OBJECT_FLOATING (object)为假,gtk_object_sink就没有任何效果。等效结果是:第一次放入容器不增加引用计数,以后放入容器都要增加引用计数。

     

    这就是妙处?呵,其实只是sink这个术语有点生僻罢了。

     

    ~~end~~

     

  • 相关阅读:
    用fmt标签对EL表达式取整
    【题解】GXOI/GZOI2019 机房游记
    【题解】【原创题目】せやな~
    【题解】折纸 origami [SCOI2007] [P4468] [Bzoj1074]
    【题解】切割多边形 [SCOI2003] [P4529] [Bzoj1091]
    【题解】【原创题目】伊卡洛斯和西瓜
    【题解】三角形 [P1222] / 三角形覆盖问题 [HNOI2012] [P3219]
    【题解】CIRU
    【题解】Railway [Uva10263]
    【学习笔记】计算几何全家桶
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167761.html
Copyright © 2011-2022 走看看