For example:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
Are there any adverse side effects of doing this?
For example:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
free(myString);
free(myString);
Are there any adverse side effects of doing this?
Yes, you can get a double free error that causes your program to crash. It has to do with malloc's internal data structures to keep track of allocated memory.
Depending on which system you run it on, nothing will happen, the program will crash, memory will be corrupted, or any other number of interesting effects.
Don't do that. If the memory that got freed is re-allocated to something else between the calls to free
, then things will get messed up.
One of nothing, silent memory corruption, or segmentation fault.
Not so clever. Google for double free vulnerabilities. Set your pointer to NULL
after freeing to avoid such bugs.
Always set a pointer to NULL after freeing it. It is safe to attempt to free a null pointer.
It's worth writing your own free wrapper to do this automatically.
Bad Things (TM)
Really, I think it's undefined so anything at all including playing "Global Thermonuclear War" with NORAD's mainframe
It may crash your program, corrupt memory, or have other more subtle negative effects. After you delete memory, it is a good idea to set it to NULL (0). Trying to free a null pointer does nothing, and is guaranteed to be safe. The same holds true for delete in c++.
Answer summary:
Yes, bad things can and probably will happen.
To prevent this do:
free(myString);
myString = NULL;
Note that all references to the memory must be set to NULL
if others were created.
Also, calling free()
with a NULL
results in no action. For more info see: man free
In short: "Undefined Behavior".
(Now, what that can include and why that is the case the others have already said. I just though it was worth mentioning the term here as it is quite common).
Here's the chapter and verse.
If the argument [to the
free
function] does not match a pointer earlier returned by thecalloc
,malloc
, orrealloc
function, or if the space has been deallocated by a call tofree
orrealloc
, the behavior is undefined. (ISO 9899:1999 - Programming languages — C, Section 7.20.3.2)
The admittedly strange macro below is a useful drop-in replacement for wiping out a few classes of security vulnerabilities as well as aid debugging since accesses to free()'d regions are more likely to segfault instead of silently corrupting memory.
#define my_free(x) do { free(x); x = NULL; } while (0)
The do-while loop is to help surrounding code more easily digest the multiple-statements. e.g. if (done) my_free(x);
Another interesting situation:
char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE);
char * yourString = myString;
if (myString)
{
free(myString);
myString = NULL;
}
// Now this one is safe, because we keep to the rule for
// setting pointers to NULL after deletion ...
if (myString)
{
free(myString);
myString = NULL;
}
// But what about this one:
if (yourString)
{
free(yourString);
yourString = NULL;
}
//?!? :)