什么是参考计数器,它是如何工作的?

时间:2017-07-13 12:05:29

标签: c

我一直在编写代码,而且我应该让另一个程序调用我的库。我应该为我的库的输出创建一个引用计数器。我已经理解的基本思想是,我需要在我想要传递的结构中包含引用计数器结构。所以我的问题如下:

  1. 制作参考柜台时应该记住什么?

  2. 制作参考柜台时有哪些完整的注意事项?

  3. 是否真的有详细的例子从哪开始呢?

  4. 提前感谢您的回答!

1 个答案:

答案 0 :(得分:0)

引用计数允许库的客户端保留库中库创建的引用对象,并允许您跟踪有多少引用仍处于活动状态。当引用计数变为零时,您可以安全地释放对象使用的内存。这是实现基本“垃圾收集”的一种方式。

在C ++中,通过使用通过构造函数和析构函数管理引用计数的“智能指针”,您可以更轻松地完成此操作,但听起来您希望在C中执行此操作。

您需要非常清楚您希望库的用户在访问对象时遵循的协议,以便在创建新引用或不再需要引用时正确地进行通信。这样做会导致过早释放仍然被引用的内存或导致永远不会释放内存(内存泄漏)。

基本上,你在struct中包含一个引用计数,每次你的库返回结构时它都会递增。

您还需要提供一个释放引用的函数:

struct Object {
  int ref;
  ....
}

Object* getObject (...) {
  Object *p = .... // find or malloc the object
  p->ref++;
  return p;
}

void releaseReference (Object* p) {
  p->ref--;
  if (p->ref == 0) free(p);
}

void grabReference (Object* p) {
  p->ref++;
}

如果您的图书馆的客户端将引用传递给另一个客户端,请使用grabReference()(在上面的示例中,您图书馆的初始调用者不需要调用grabReference()

如果您的代码是多线程的,那么您需要确保在递增或递减引用时正确处理