幻想小说网 酷文学 深夜书屋 叮当小说网 找小说网 无限小说网 红尘小说网

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

posted on 2008-05-21 08:04  张云临  阅读(309)  评论(0编辑  收藏  举报

导航