2

引用计数结构如何工作?例如让我们看一下SDL_Surface

typedef struct SDL_Surface
{
    ...
    int refcount;
} SDL_Surface;

s = SDL_CreateRGBSurface(...); // <-- what happens here?
SDL_FreeSurface(s); // <-- and here?

如何在自己的代码中实现引用计数?

4

1 回答 1

4

SDL_CreateRGBSurface将分配SDL_Surface(或合适的派生结构)的新实例,并增加引用计数(将其设置为 1)。

SDL_FreeSurface将减少引用计数,并检查它是否为零。如果是,则意味着没有其他对象正在使用该表面,它将被释放。

SDL 还保证每当对象在其他地方(例如在渲染器中)使用时,引用计数就会增加。因此,如果在调用时引用计数不为零SDL_FreeSurface,则必须有其他对象在使用它。另一个对象最终也会调用SDL_FreeSurface并永久释放表面。

引用计数允许您廉价地跟踪对象,而无需循环收集垃圾收集器的开销。然而,一个缺点是它不能处理循环(例如,对象 A 持有对 B 的引用,而 B 又持有对 B 的引用);在这些情况下,即使所有其他外部引用都消失了,循环也会使所涉及的对象保持活动状态。

要实现引用计数,您只需向要引用计数的任何对象添加一个引用计数字段,并确保(在您的公共 API 和内部)对象的每次分配和释放都通过适当的引用计数维护接口(您必须定义)。最后,当一个对象或函数想要引用您的引用计数的对象时,它们必须首先通过增加引用计数(直接或通过某些接口)来获取引用。完成后,他们必须减少引用计数。

于 2012-08-26T06:11:01.737 回答