• ref/unref应该返回什么值


    ref/unref应该返回什么值

    转载时请注明出处和作者联系方式
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    引用计数是追踪对象生命周期最常用的方法,一方面保证对象在有人使用时不会被销毁,另外一方面又保证不会因为忘记销毁对象而造成内存泄漏。具有引用计数功能的对象一般都会提供两个函数:ref用于增加引用计数,unref用于减少引用计数,计数为0时销毁对象。
     

    一个有趣的问题是,这两个函数应该返回什么值呢?

    我们先看看gobject:

    gpointer    g_object_ref                      (gpointer        object);

    void        g_object_unref                    (gpointer        object);


    我们再看看dbus:

    BusConnections* bus_connections_ref               (BusConnections               *connections);

    void            bus_connections_unref             (BusConnections               *connections);

    ref函数返回对象本 身,unref函数没有返回值,这个大家似乎已经达成共识了。ref函数返回对象本身使得调用很方便,可以在赋值的同时增加引用计数。unref函数没有 返回值,在大多数情况下没有问题。直到最近遇到一个小麻烦,我才觉得unref没有返回值是不妥当的。

    这个小麻烦是这样的,我 在线程局部存储(TLS)中保存了一个BusConnections对象,第一次使用时创建它,以后有人使用时就增加引用计数,不使用了就减少引用计数, 直到引用计数为0时销毁BusConnections对象。为了防止无效指针,必须在引用计数为0时把TLS中的BusConnections对象置为 空,否则在下次调用时就会出问题。

    BusConnections结构是在connection.c中定义的,refcount是私有变量,外部调用者无法访问。为了知道BusConnections对象的引用计数何时变为0了,我只好在外面再加一个引用计数,这样不但看起来不伦不类,使用起来也不方便。

    refcount作为public变量自然是不合适的,再加一个get_refcount的函数又比较麻烦。怎么办好呢?最简单的办法是由unref返回refcount。这样在使用和实现时都很方便,从语义上说也是合符情理的。

    ~~end~~
  • 相关阅读:
    Hibernate中的一对一注解配置
    Hibernate=====HQL实用技术
    Hibernate中的session的线程安全问题
    初学orcale(一)
    initBinder转换日期格式
    poi学习
    jqueryUI学习
    JavaScript中node的相关属性
    JavaScript函数的调用(通过节点)--JavaScript DOM编程艺术
    DOM中的四种方法--Javascript DOM编程艺术
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167640.html
Copyright © 2020-2023  润新知