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~~

     

  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167761.html
Copyright © 2011-2022 走看看