When dynamic memory is reserved, the systems marks the portion as occupied and the data is kept in that location. However, when the memory is deallocated, its content is no longer guaranteed, and it might be used by the operating system for internal purposes.
This observation is important because the free
function receives a pointer as only parameter, deallocates its content, but
there is nothing preventing another access with that pointer in what is
known as a “corrupted pointer” access. The following code
portion shows an example of this problem.
struct list_element { int; struct list_element *next; }; void destroy(struct list_element *l) { while (l != NULL) { free(l); l = l->next; } return; }
The line that advances through the chain of pointers l
= l ->next
is accessing the memory portion pointed to by
l
which has been previously deallocated, thus its content is
not guaranteed and the field next
might not contain the
expected data. One way to solve this problem is to copy the pointer to a
location that without this problem, for example, a local variable.