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

J. *_*ava 0 c

我一直在写代码,现在我应该有另一个程序调用我的库。我应该为我的图书馆的输出制作一个参考计数器。我所理解的基本思想是,我需要在我想要传递的结构中包含引用计数器结构。所以我的问题如下:

  1. 制作参考计数器时应注意什么?

  2. 制作参考计数器时有哪些完整的禁忌?

  3. 真的有详细的例子从哪里开始吗?

提前感谢您的回答!

zak*_*um1 5

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

在 C++ 中,通过使用通过构造函数和析构函数管理引用计数的“智能指针”,您可以更轻松地做到这一点,但听起来您希望在 C 中做到这一点。

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

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

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

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++;
}
Run Code Online (Sandbox Code Playgroud)

使用grabReference()如果库的客户端传递到另一个客户端引用(在上面的例子中,库的初始调用者不需要调用grabReference()

如果您的代码是多线程的,那么您需要确保在增加或减少引用时正确处理这个问题