c - Why does free work like this? -
given following code:
typedef struct tokens { char **data; size_t count; } tokens; void freetokens(tokens *tokens) { int d; for(d = 0;d < tokens->count;d++) free(tokens->data[d]); free(tokens->data); free(tokens); tokens = null; }
why need extra:
free(tokens->data);
shouldn't handled in loop?
i've tested both against valgrind/drmemory , indeed top loop correctly deallocates dynamic memory, if remove identified line leak memory.
howcome?
let's @ diagram of memory you're using in program:
+---------+ +---------+---------+---------+-----+ | data | --> | char * | char * | char * | ... | +---------+ +---------+---------+---------+-----+ | count | | | | +---------+ v v v +---+ +---+ +---+ | | | b | | c | +---+ +---+ +---+ |...| |...| |...| +---+ +---+ +---+
in c, can dynamically allocate space group (more simply, array) of elements. however, can't use array type reference dynamic allocation, , instead use pointer type. in case, pointer points first element of dynamically allocated array. if add 1 pointer, you'll pointer second element of dynamically allocated array, add 2 pointer second element, , on.
in c, bracket syntax (data[1]
) shorthand addition , dereferencing pointer. pointers in c can used arrays in way.
in diagram, data
pointing first char *
in dynamically allocated array, elsewhere in memory.
each member of array pointed data
string, dynamically allocated (since elements char *
s).
so, loop deallocates strings ('a...'
, 'b...'
, 'c...'
, etc), free(tokens->data)
deallocates array data
points to, , finally, free(tokens)
frees entire struct.
Comments
Post a Comment