Is there a difference between those two variants of calling free
after allocating memory on the heap:
// variant 1
int* p1 = (int*) malloc(sizeof(int)*4);
free(p1);
//variant 2
int* p2 = (int*) malloc(sizeof(int)*4);
free(*p2);
*p2 = NULL;
Is there a difference between those two variants of calling free
after allocating memory on the heap:
// variant 1
int* p1 = (int*) malloc(sizeof(int)*4);
free(p1);
//variant 2
int* p2 = (int*) malloc(sizeof(int)*4);
free(*p2);
*p2 = NULL;
Yes, there is a difference.
Variant 2 is invalid. free
expects a pointer previously returned by malloc
, calloc
, or realloc
. *p2
is the first int
in the allocated space, though. As man free
says, undefined behavior occurs therefore (quotation adjusted for this specific case):
free()
function frees the memory space pointed to by [p1
], which must have been returned by a previous call tomalloc()
,calloc()
, orrealloc()
. Otherwise, [...] undefined behavior occurs.
Notes:
Yes. free(*p2)
is invalid.
free
frees the memory at the address it's given. Consider: what does p1
evaluate to? Its value is the pointer that malloc
returned - so p1
evaluates to the pointer to the memory that malloc
allocated.
What does *p2
evaluate to? Its value is the integer that is stored at the address of p2
. This can be anything and it is very unlikely it'll be a valid pointer. Thus free
will attempt to free an invalid memory address and you'll get a segfault if you're lucky.
Yes, there's a difference. The first way, called on a pointer pointing to memory allocated by malloc
is right. The second, calling a dereference of such a pointer, attempts to free some arbitrary memory address (with the value held in the value that pointer is pointing to), and is just wrong.
free(p1);
This is valid as you allocate memory to p1
and then free
, thus no problem.
free(*p2);
It is unlikely to be valid as *p2
may or may not be a valid pointer (which need to have an allocated memoty ).
using free() on a pointer which is not allcocated memory using malloc or similar will cause error.