ref/unref应该返回什么值
<!--[if !supportEmptyParas]--> 转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>
引用计数是追踪对象生命周期最常用的方法,一方面保证对象在有人使用时不会被销毁,另外一方面又保证不会因为忘记销毁对象而造成内存泄漏。具有引用计数功能的对象一般都会提供两个函数:ref用于增加引用计数,unref用于减少引用计数,计数为0时销毁对象。
<!--[endif]-->
一个有趣的问题是,这两个函数应该返回什么值呢?
我们先看看gobject:
<!--[endif]-->
void g_object_unref(gpointer object );
我们再看看dbus:
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~~