我一直在写代码,现在我应该有另一个程序调用我的库。我应该为我的图书馆的输出制作一个参考计数器。我所理解的基本思想是,我需要在我想要传递的结构中包含引用计数器结构。所以我的问题如下:
制作参考计数器时应注意什么?
制作参考计数器时有哪些完整的禁忌?
真的有详细的例子从哪里开始吗?
提前感谢您的回答!
引用计数允许您的库的客户端将您的库创建的引用对象保留在堆上,并允许您跟踪仍有多少引用处于活动状态。当引用计数变为零时,您可以安全地释放对象使用的内存。这是一种实现基本“垃圾收集”的方法。
在 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())
如果您的代码是多线程的,那么您需要确保在增加或减少引用时正确处理这个问题
| 归档时间: |
|
| 查看次数: |
3698 次 |
| 最近记录: |