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