引用计数结构如何工作?例如,让我们看一下SDL_Surface
:
typedef struct SDL_Surface
{
...
int refcount;
} SDL_Surface;
s = SDL_CreateRGBSurface(...); // <-- what happens here?
SDL_FreeSurface(s); // <-- and here?
如何在我自己的代码中实现引用计数?
答案 0 :(得分:4)
SDL_CreateRGBSurface
将分配SDL_Surface
的新实例(或合适的派生结构),并增加引用计数(将其设置为1)。
SDL_FreeSurface
将递减引用计数,并检查它是否为零。如果是,那意味着没有其他对象正在使用表面,并且它将被解除分配。
SDL还保证每当对象在其他地方使用时(例如在渲染器中),refcount都会递增。因此,如果在调用SDL_FreeSurface
时引用计数不为零,则其他一些对象必须使用它。另一个对象最终也会调用SDL_FreeSurface
并释放表面。
引用计数允许您廉价地跟踪对象,而不会产生循环收集垃圾收集器的开销。然而,一个缺点是它不会处理循环(例如,对象A持有对B的引用,而B又引用对B的引用);在这些情况下,即使所有其他外部引用都消失,周期也会使对象保持活动状态。
要实现引用计数,您只需要向要引用的任何对象添加引用计数字段,并确保(在您的公共API中和内部)对象的每个分配和释放都通过适当的refcount维护接口(你必须定义)。最后,当一个对象或函数想要引用你的refcounted对象时,它们必须首先通过递增refcount(直接或通过某个接口)来获取引用。完成后,他们必须减少引用数量。