Reputation: 1116
I'm stuck at a problem with memory allocation and freeing it.
I'm trying to implement a dictionary using a compressed trie (Patricia). I have a trie library which works correctly when I call its functions from main. However, I have a little problem when I'm trying to parse input.
I have a parser library which reads a word from the standard input and calls the insert
function from the trie library. It calls it this way:
void tryInsert(char *commandLine, struct tree *t) {
char *arg[3] = { NULL };
sscanf(commandLine, "%ms %ms%ms", &arg[0], &arg[1], &arg[2]);
if (arg[1] == 0 || arg[2] != 0 || !consistsOfSmallCases(arg[1]))
printf("ignored\n");
else
//inserting arg[1] into tree
insert(t, arg[1]);
// free(arg[0]);
// free(arg[1]);
// free(arg[2]);
}
The three calls of the "free" function are now marked as commets, because:
the insert
function has two argument: a trie and a char *word
. Inside this function, I insert a suffix of word
into some a new of the trie. This means that I don't want to free the memory that's allocated for the string right away.
However, since I'm only inserting a suffix, I lose control of the prefix.
Which means that if, inside a clear
function that clears the trie, I call free(node->content)
, I don't actually free all the memory allocated.
Moreover, when try and copy the string word
into char word1[256]
inside the insert
function and un-comment those thee frees, everything stops working.
I would appreciate any ideas how to deal with that,
Upvotes: 3
Views: 239
Reputation: 399793
You have some logic errors in your code, which is always scary when dealing with dynamic memory.
The insert()
function needs to do a copy of the part of the string that it wishes to store, since it only wants a prefix.
Also, you really should check that sscanf()
succeeds before relying on the variables having valid values. If it doesn't return 3
, there was a parsing problem and not all of the strings will have been allocated. Check the return value.
Upvotes: 2