用memset链接destroy

时间:2015-12-30 15:34:53

标签: c list

我在我买的一本书中找到了这个,这是关于算法的。

我想知道它是否允许通过C99标准 摧毁像这样的链接列表,或者是否有任何约定表明这是愚蠢的?

void list_destroy(List *list) {
   void *data;
   while (list_size(list) > 0) {
       if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL) {
           list->destroy(data);
       }
   }
   memset(list, 0, sizeof(List));
   return;
}

为什么这样做?我学会了用free()来释放已分配的内存?

2 个答案:

答案 0 :(得分:2)

我不确定是什么让你失望,所以我们来讨论那段代码。

while (list_size(list) > 0) 

虽然列表中有项目,但我们重复以下块。对我来说并不稀奇。我们继续吧。

if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy != NULL) {

好的,调用函数list_rem_next。我只能猜测它的作用,但可能会从列表中删除一些元素并将此删除元素的数据存储到data变量中。

接下来,我们检查list->destroy是否为空。显然,这是一个可以释放数据结构的函数指针。 (因此,如果列表中的项目是malloc,则会指向free

list->destroy(data);

如果这是一个有效的指针,则执行该函数并将数据传递给destroy。

memset(list, 0, sizeof(List));

最后, list 结构变为零。有点奇怪,但为什么不呢。这只是将list中的0写入第3个参数指定的字节数。

答案 1 :(得分:1)

大概list->destroy函数正在执行" free"。

在完美构建的程序中,没有理由你不再使用的零输出内存。但是你有时会看到这样的代码:

memset(list, 0, sizeof(List));

甚至是这样的:

memset(list, 0x53, sizeof(List));      /* or some other "curious" value */

作为一种捕获格式错误的程序的方法,这些程序在释放后尝试访问内存。这个想法是零(或奇怪的值)更有可能导致程序在访问先前释放的内存时立即死亡,而不是它具有良好的数据"还在那里(一种原始的"诱杀陷阱")。