c

时间:2015-04-27 11:42:13

标签: c memory-leaks tree

我的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);
  }

1 个答案:

答案 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