There seem to be two arguments why one should set a pointer to NULL
after freeing them.
Avoid crashing when double-freeing pointers.
Short: Calling free()
a second time, by accident, doesn't crash when it's set to NULL
.
Almost always this masks a logical bug because there is no reason to call
free()
a second time. It's safer to let the application crash and be able to fix it.It's not guaranteed to crash because sometimes new memory is allocated at the same address.
Double free occurs mostly when there are two pointers pointing to the same address.
Logical errors can lead to data corruption too.
Avoid reusing freed pointers
Short: Accessing freed pointers can cause data corruption if malloc()
allocates memory in the same spot unless the freed pointer is set to NULL
There's no guarantee that the program crashes when accessing the
NULL
pointer, if the offset is big enough (someStruct->lastMember
,theArray[someBigNumber]
). Instead of crashing there will be data corruption.Setting the pointer to
NULL
cannot solve the problem of having a different pointer with the same pointer value.
The questions
Here's a post against blindly setting a pointer to NULL
after freeing.
- Which one is harder to debug?
- Is there a possibility to catch both?
- How likely is it, that such bugs lead to data corruption instead of crashing?
Feel free to expand this question.