我需要为我正在进行的项目使用FIFO。我在互联网上找到了这个实现,我无法弄清楚这个功能发生了什么。我希望有人可以启发我。
/* Free an entire fifo */
void fifo_free(fifo_t *f, void (*freefn)(void *))
{
fifonode_t *fn = f->f_head;
fifonode_t *tmp;
if (freefn == NULL)
freefn = fifo_nullfree;
while (fn) {
(*freefn)(fn->fn_data);
tmp = fn;
fn = fn->fn_next;
free(tmp);
}
free(f);
}
...
/*ARGSUSED*/
static void fifo_nullfree(void *arg)
{
/* this function intentionally left blank */
}
了解它如何使用void (*freefn)(void *)
作为参数?为什么?为什么该指针传递给函数? (*freefn)(fn->fn_data)
这些线的重点是什么?
if (freefn == NULL)
freefn = fifo_nullfree;
在这种情况下评论是否同样有效?
您可以查看此实施的完整副本here
答案 0 :(得分:4)
fifo_free函数只知道如何释放用于fifonode_t
项的内存,它不知道如何处理这些项中的数据(由fn_data指向)。这是freefn
进来的地方。
参数void (*freefn)(void *)
是指向函数的指针。该函数采用void指针。这用于释放存储在FIFO中每个fifonode_t
的数据。
在某些情况下,您可能不需要做任何有关释放额外数据的事情(比如说您存储了指向其他静态数据的指针)。在这种情况下,您可以为freefn
传递NULL,函数将使用fifo_nullfree
作为函数,它基本上什么都不做。
注意:fifo_free
函数可以很容易地在循环内完成if测试,如果它不是NULL,则只调用freefn
函数。可能他们有一些理由不这样做。