我在我买的一本书中找到了这个,这是关于算法的。
我想知道它是否允许通过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()来释放已分配的内存?
答案 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 */
作为一种捕获格式错误的程序的方法,这些程序在释放后尝试访问内存。这个想法是零(或奇怪的值)更有可能导致程序在访问先前释放的内存时立即死亡,而不是它具有良好的数据"还在那里(一种原始的"诱杀陷阱")。