>-+There was quite a bit of discussion a long time ago
>-+about using <struct>->next in loop conditions.
>-+If I remember correctly, it could all be summarized with:
>-+don't do it.
It's not whether you use for or while, it's whether you understand what the for
command does, and the dangers of allowing it to access freed data. These 2
snippets are equally flawed:
for (obj = list; obj; obj = obj->next)
free(obj);
obj=list;
while (obj) {
free(obj);
obj = obj->next;
}
As a matter of fact, they should generate pretty much identical code. When you
are walking down a linked list, it's a Good Idea(tm) to save the next object,
before you start molesting the current one.
for (obj = list; obj; obj = next) {
next = obj->next;
free(obj);
}
You could also call a function recursively to do it like so:
void ofree(obj)
{
if (obj->next) ofree(obj->next);
free(obj);
}
ofree(list);
This frees the list starting from the end and works backwards.
Ron
PS: I know most of you knew this already, but for some new coders, this is one
of those "light coming on" things, where suddenly all that linked list/pointer
stuff makes sense... :-)
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST