我的C程序中需要一些内存泄漏方面的帮助。以下函数搜索基数trie以查找具有给定数字的单词。它在每次递归调用中分配一些内存,我不知道如何对其进行排序,以便分配的块不会丢失。请帮忙。
char *substring(char *str, int position, int length) {
int c = 0;
char *sub = malloc(length*(sizeof(char))+1);
while (c < length) {
sub[c] = str[position + c];
c++;
}
return sub;
}
void prev(int w, int start, int end) {
char *newWord = "";
bool found = false;
void prevRec(struct tNode *t,
int w, int start, int end, char *soFar, int prevLength) {
if (t != NULL) {
char *updatedWord = malloc(strlen(soFar) + strlen(t->word));
strcpy(updatedWord,soFar);
strcat(updatedWord,t->word);
printf("%s\n", updatedWord);
int length = strlen(t->word);
if (t->count == w) {
found = true;
if ((start > -1) && (end <= strlen(updatedWord))) {
newWord = updatedWord;
} else {
newWord = "";
}
} else {
struct tNode *tmp = t->child;
struct tNode *tmp1 = NULL;
while ((tmp != NULL) && (!found)) {
prevRec(tmp,w,start,end,updatedWord,length);
tmp1 = tmp;
tmp = tmp->brother;
updatedWord = substring(updatedWord, 0, strlen(updatedWord) - prevLength);
}
}
}
}
prevRec(root,w,start,end,newWord,0);
printf("%s\n",newWord);
if (strlen(newWord) == 0) printf("ignored");
else {
char *tmp = substring(newWord,start,end - start + 1);
insert(tmp);
free(tmp);
}
答案 0 :(得分:3)
你必须释放你分配的内容。在你的情况下,你可以......像那样:替换
updatedWord = substring(updatedWord, 0, strlen(updatedWord) - prevLength);
通过
char *sub = substring(updatedWord, 0, strlen(updatedWord) - prevLength);
free( updatedWord );
updatedWord = sub;
并添加另一个
free( updatedWord );
作为if( t != NULL )
块的最后一行。
除了@Eregith在他的评论中已经提到过,你分配的长度中缺少NULL的'+1'。您还应该添加一些错误检查,因为malloc()
可能会返回NULL